gpt4 book ai didi

c# - IMemoryCache,驱逐前刷新缓存

转载 作者:行者123 更新时间:2023-12-03 09:39:43 25 4
gpt4 key购买 nike

我正在尝试将我的 .Net 框架应用程序迁移到 .Net Core,在此过程中,我想将我的内存缓存从 System.Runtime.Caching/MemoryCacheMicrosoft.Extensions.Caching.Memory/IMemoryCache .但我对 IMemoryCache 有一个问题。 ,我找不到在删除/驱逐之前刷新缓存的方法。

System.Runtime.Caching/MemoryCache 的情况下,有UpdateCallback位于 CacheItemPolicy 的属性(property)我可以设置回调函数的委托(delegate),这个函数将在缓存对象被驱逐之前在一个单独的线程中调用。即使回调函数需要很长时间才能获取新数据,MemoryCache将在过期期限后继续提供旧数据,这确保我的代码在缓存刷新过程中无需等待数据。

但是我在 Microsoft.Extensions.Caching.Memory/IMemoryCache 中没有看到这样的功能。 , 有RegisterPostEvictionCallback属性(property)和PostEvictionCallbacks MemoryCacheEntryOptions 中的扩展方法.但是这两个都将在缓存条目从缓存中逐出后被触发。所以如果这个回调需要更长的时间,所有获取这个数据的请求都需要等待。

有什么解决办法吗?

最佳答案

那是因为没有驱逐,而且,我认为,这使得 IMemoryCache 不是缓存:
“当系统内存不足时,ASP.NET Core 运行时不会修剪缓存。”
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-5.0#use-setsize-size-and-sizelimit-to-limit-cache-size
“如果没有设置 SizeLimit,缓存会无限增长。”
“缓存大小限制没有定义的度量单位,因为缓存没有衡量条目大小的机制。”
“如果缓存条目大小的总和超过 SizeLimit 指定的值,则不会缓存条目。”
因此,IMemoryCache 不仅无法完成您期望从缓存中完成的最基本的事情——通过驱逐最旧的条目来响应内存压力——您也没有您期望的插入逻辑。将新项目添加到完整的“缓存”不会驱逐旧条目,它拒绝插入新项目。
我认为这只是一个不幸的字典,根本不是缓存。蛋糕/类(class)是个谎言。
为了让它真正像缓存一样工作,您需要编写一个测量内存大小的包装器类,以及与驱逐(通过 .Remove() )以响应内存压力和过期的包装器交互的系统代码,定期.你知道——实现缓存的大部分工作。
所以,你找不到在驱逐之前更新的原因是因为默认情况下没有任何驱逐,如果你已经实现了自己的驱逐方案,你已经写了这么多实际的缓存,写的是什么多一点?

关于c# - IMemoryCache,驱逐前刷新缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58406476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com