.Net Core Memory cache.我希望在从缓存中删除项目时收到通知。实现此示例后: https://learn.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);
PostEvicionCallback
不是过期事件。
当从 缓存,而不是过期。
过期条目的删除在过期后延迟完成 对缓存的操作。这就是为什么在下一次执行回调的原因 过期后的请求。出于性能考虑,我们删除了 批量过期商品,其最短期限由 MemoryCacheOptions.ExexpationScanFrequency.
我们目前没有公开任何机制来准确通知缓存时间 条目过期,但过期的条目最终将触发 在任何缓存操作之后的某个时间到期回调。
从 github.com/aspnet/Caching
您可以尝试降低 MemoryCacheOptions.ExexpationScanFrequency,但要注意性能影响。默认值为 1 分钟。