使用Fusion Cache强制刷新缓存值并保留缓存踩踏防护可行吗?
需求完全可行,以下是实现方案
核心实现逻辑:借助Fusion Cache的
ForceRefresh参数,搭配其内置的分布式锁机制,既能强制获取新的访问令牌,又能避免缓存踩踏。当你发现未过期的缓存令牌实际失效(比如接口返回401),无需先清空缓存,直接触发带强制刷新的缓存获取操作即可。代码示例:
var cacheKey = "access_token"; var token = await _fusionCache.GetOrSetAsync( cacheKey, async () => await FetchNewAccessTokenFromAuthServer(), TimeSpan.FromMinutes(30), // 常规缓存过期时长 options => { options.ForceRefresh = true; // 跳过现有缓存,强制获取新值 options.DistributedCacheLockTimeout = TimeSpan.FromSeconds(10); // 防踩踏锁超时,确保仅一个请求去调用授权服务 } );这里
ForceRefresh会让Fusion Cache直接执行获取新令牌的委托,同时分布式锁会限制同一时刻只有一个请求去访问授权服务器,其他请求会等待锁释放后直接使用新缓存的令牌,完全保留防缓存踩踏的能力。关键注意点:
- 不要先调用
Remove再执行GetOrSet,这种操作会制造缓存空窗期,反而提升踩踏风险,ForceRefresh是更安全的选择。 - Fusion Cache默认开启了
CacheStampedeProtection,确保强制刷新过程中锁机制正常运作。 - 针对内存+数据库的双层缓存配置,
ForceRefresh会同步刷新两层缓存,保证数据一致性。
- 不要先调用
内容的提问来源于stack exchange,提问作者Sheldor the conqueror
相关产品推荐
相关产品推荐

