Kri*_*aya 5 c# caching memorycache .net-core asp.net-core
我正在尝试将.Net框架应用程序迁移到.Net Core,在此过程中,我想将内存中的缓存从System.Runtime.Caching/MemoryCache迁移到Microsoft.Extensions.Caching.Memory/IMemoryCache。但是我有一个问题IMemoryCache,在删除/撤消缓存之前,我找不到刷新缓存的方法。
在的情况下System.Runtime.Caching/MemoryCache,可以UpdateCallback在CacheItemPolicy其中设置回调函数的委托的属性,并且在逐出缓存对象之前,将在单独的线程中调用此函数。即使回调函数需要很长时间来获取新数据,MemoryCache仍将在过期之前继续提供旧数据,这确保了我的代码在缓存刷新过程中无需等待数据。
但是我没有看到这样的功能,在Microsoft.Extensions.Caching.Memory/IMemoryCache里面有
RegisterPostEvictionCallback属性和PostEvictionCallbacks扩展方法MemoryCacheEntryOptions。但是这两个都将在从缓存中逐出缓存条目后触发。因此,如果此回调花费较长时间,则需要等待所有获取此数据的请求。
有什么解决办法吗?
那是因为没有驱逐,而且,我认为,这使得 IMemoryCache不是缓存:
“当系统内存不足时,ASP.NET Core 运行时不会修剪缓存。”
“如果未设置 SizeLimit,则缓存会无限增长。” “缓存大小限制没有定义的测量单位,因为缓存没有测量条目大小的机制。” “如果缓存条目大小的总和超过 SizeLimit 指定的值,则不会缓存条目。”
因此,IMemoryCache 不仅无法完成您期望从缓存中获得的最基本的操作(通过逐出最旧的条目来响应内存压力),而且您也没有您期望的插入逻辑。将新项目添加到完整的“缓存”不会驱逐旧条目,而是拒绝插入新项目。
我认为这只是一个不幸的字典,根本不是缓存。蛋糕/课程是一个谎言。
为了让它像缓存一样工作,您需要编写一个测量内存大小的包装器类,以及与包装器交互的系统代码,该包装器.Remove()定期根据内存压力和过期而逐出(通过 )。你知道 - 实现缓存的大部分工作。
因此,您无法在驱逐之前找到更新方法的原因是因为默认情况下没有任何驱逐,并且如果您实现了自己的驱逐方案,那么您已经编写了很多实际的缓存,正在编写什么多一点?
小智 1
看起来您需要通过调用AddExpirationToken为每个 CacheEntry 设置自己的 ChangeToken 。然后,在 IChangeToken.HasChanged 的实现中,您可以有一个简单的超时到期,在触发之前,您可以异步搜索可以添加到缓存中的新数据。