You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:32:37