如何让HybridCache仅缓存非null值?
解决方案:阻止分布式缓存存储Null值
默认的GetOrCreateAsync方法会将工厂Lambda返回的所有值(包括null)都存入缓存,这显然不符合你的需求。要实现仅缓存非null值的逻辑,你需要手动拆解缓存操作流程,而非依赖GetOrCreateAsync的自动处理:
修改后的代码如下:
public async Task<Foo?> GetFoo(string someParam) { var cacheKey = $"Key_{someParam}"; // 先尝试从缓存获取 var cachedFooBytes = await distributedCache.GetAsync(cacheKey); if (cachedFooBytes != null) { // 根据实际序列化方式反序列化,示例使用Json return JsonSerializer.Deserialize<Foo>(cachedFooBytes); } // 缓存未命中时调用工厂方法获取数据 var foo = await FactoryMethodToGetFoo(someParam); if (foo != null) { // 仅当结果非null时,存入缓存 var serializedFoo = JsonSerializer.SerializeToUtf8Bytes(foo); await distributedCache.SetAsync(cacheKey, serializedFoo); } return foo; }
逻辑说明
- 先尝试从缓存读取数据,避免不必要的工厂方法调用
- 缓存未命中时,调用
FactoryMethodToGetFoo获取数据 - 只有当返回的
foo不为null时,才将其序列化后存入分布式缓存 - 无论结果是否为
null,最终都返回获取到的值
这样就能确保首次调用返回null时不会缓存该结果,后续调用仍会触发工厂方法尝试获取有效值,直到拿到非null值后才会缓存起来。
内容的提问来源于stack exchange,提问作者Webreaper
相关产品推荐
相关产品推荐

