c# - 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);
解决方案
这PostEvicionCallback
不是到期事件。
当从缓存中删除缓存条目时执行回调,而不是在到期时执行。
过期条目的删除是在缓存操作过期后延迟完成的。这就是为什么在到期后在您的下一个请求上执行回调的原因。出于性能考虑,我们分批删除过期项目,其最短期限由 MemoryCacheOptions.ExpirationScanFrequency 指定。
我们目前没有公开任何机制来准确通知缓存条目何时过期,但过期条目最终会在任何缓存操作后的某个时间触发过期回调。
您可以尝试降低 MemoryCacheOptions.ExpirationScanFrequency,但要注意性能影响。默认值为 1 分钟。
推荐阅读
- node.js - 如何使用节点 js 进行 Mongodb 备份
- c++ - GCC 8.3 无法编译 std::bind_front
- powershell - 获取多个 AD 组中的用户
- python - 关于Tweepy api的问题
- java - 如何将 XML 字符串添加到现有的 BaseX 数据库?
- c++ - 1D 中的非均匀 FFT 前向和后向测试
- java - 在 java 类中从 @XMLElement 获取注释值
- npm - NPM 在更新另一个包时会卸载不相关的包
- java - 从包含部分文件的 hadoop 文件中读取 n 行
- javascript - 您将如何在 DynamoDB 中为一对多和多对多建模