首页 > 解决方案 > MemoryCache EvictionCallback 从未调用过

问题描述

.Net 核心内存缓存。我希望在从缓存中删除项目时收到通知。已实现此示例: https ://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-3.1

=> CreateCallbackEntry()。当我在里面放一个断点

驱逐回调:

private static void EvictionCallback(object key, object value,
    EvictionReason reason, object state)
{
    var message = $"Entry was evicted. Reason: {reason}.";
    // i should reach this after 10 seconds
}

只有在尝试再次读取刚刚存储在缓存中的相同键时,才会触发断点。否则,即使网页保持打开状态,也不会调用该驱逐方法。

控制器:

    public void OnGet()
    {
        _cache.GetOrCreate("key", item);

        // eviction callback does not fire until I query for the same key again below
        var t = _cache.GetOrCreate("key", item)
    }

缓存:

var cacheEntryOptions = new MemoryCacheEntryOptions()
    .SetAbsoluteExpiration(TimeSpan.FromSeconds(10))
    .RegisterPostEvictionCallback(callback: EvictionCallback, state: this);

cacheEntry = await createItem();
_cache.Set(key, cacheEntry, cacheEntryOptions);

标签: c#.netmemorycache

解决方案


PostEvicionCallback不是到期事件。

当从缓存中删除缓存条目时执行回调,而不是在到期时执行。

过期条目的删除是在缓存操作过期后延迟完成的。这就是为什么在到期后在您的下一个请求上执行回调的原因。出于性能考虑,我们分批删除过期项目,其最短期限由 MemoryCacheOptions.ExpirationScanFrequency 指定。

我们目前没有公开任何机制来准确通知缓存条目何时过期,但过期条目最终会在任何缓存操作后的某个时间触发过期回调。

来自github.com/aspnet/Caching

您可以尝试降低 MemoryCacheOptions.ExpirationScanFrequency,但要注意性能影响。默认值为 1 分钟。


推荐阅读