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

.NET 8 MemoryCache滑动过期未访问时无法自动驱逐求助

MemoryCache滑动过期回调未触发的实现问题

我遇到的问题和Stack Overflow上相关问题类似,但现有答案仅解释原理,未给出可行的实现方案。

当前我使用以下代码配置缓存项:

var options = new MemoryCacheEntryOptions()
{
    // 未访问x分钟后移除
    SlidingExpiration = TimeSpan.FromMinutes(x),
}
.RegisterPostEvictionCallback(OnCacheItemRemoved);

但发现一个问题:缓存项只有在时间点t1 > t0 + x'时被访问,才会被移除。这意味着如果之后不再访问该缓存项,它会一直留在缓存中,永远不会被清理。

我不想设置绝对过期时间,因为这会覆盖滑动窗口机制——如果缓存项仍在被访问,绝对过期会强制将其驱逐。我需要的是纯粹的滑动窗口逻辑:缓存项未被访问x分钟后自动驱逐,期望内部通过定时器处理,性能上每分钟检查一次即可。

起初我没找到驱逐检查的配置项,后来发现在DI中注册MemoryCache时,有ExpirationScanFrequency配置项:

services.AddMemoryCache(options => {
    // 每分钟检查一次过期缓存项
    options.ExpirationScanFrequency = TimeSpan.FromMinutes(1);
});

但这个配置似乎不起作用:我将x设为1分钟,之后完全不访问该缓存项,过了好几分钟,我的驱逐回调OnCacheItemRemoved仍未被触发。

内容的提问来源于stack exchange,提问作者Wouter Vandenputte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:57:07