MemoryCache - 防止项目过期

Posted

技术标签:

【中文标题】MemoryCache - 防止项目过期【英文标题】:MemoryCache - prevent expiration of items 【发布时间】:2018-05-10 23:07:32 【问题描述】:

在我的应用程序中,我使用 MemoryCache,但我不希望项目过期。因此,项目使用默认策略插入到缓存中,而不设置 AbsoulteExpirationSlidingExpiration

最近,在最后的高端服务器上,我遇到了缓存问题,因为它返回空值而不是之前插入到缓存中的所需值。事实证明,不仅可以从缓存中删除符合过期条件的项目(如明确设置了过期日期的项目)。在内存压力下,当超过CacheMemoryLimit 和/或PhysicalMemoryLimit 的值时,MemoryCache 也会删除其他元素。

如何预防?如何确定,当元素被设置一次缓存时,它可以安全地再次从中获取?

我考虑将PollingInterval 设置为某个巨大的值,但这只会延迟潜在的问题(并且轮询间隔在文档中被引用为最大时间,而不是确切或最小时间)。将PhysicalMemoryLimitPercentage 设置为 100% 也不能解决问题,因为它引用的是物理安装的内存,而不是整个可用的虚拟内存。还是我错了,它确实会有所帮助?

【问题讨论】:

您的问题指示我们建议增加 RAM 或定期从缓存中删除一些值。你不能永远填满缓存。 也许您想改用静态 ConcurrentDictionary? CacheItemPolicy 有一个Priority 属性,可以设置为NotRemovable 谢谢@EricB,我不知何故错过了这个设置,这正是我需要的。 我添加了我的评论的扩展版本作为答案,因为它解决了您的问题,并帮助其他人在未来找到它。 【参考方案1】:

CacheItemPolicy 有一个Priority 属性,可以设置为NotRemovable

不过,您确实需要知道使用此设置将多少数据添加到缓存中。不断地将数据添加到缓存中并且从不删除它最终会导致内存或溢出问题。

缓存通常用于缓存中不再存在的项目是可接受的,在这种情况下,会从持久存储(例如数据库或文件)中再次检索该值。

在您的情况下,听起来您的代码需要该项目存在,这可能建议寻找另一种方法(例如,在 cmets 中提到的静态 ConcurrentDictionary)。

【讨论】:

CacheItemPolicy 只影响内存压力驱逐时是否清除; 没有过期。

以上是关于MemoryCache - 防止项目过期的主要内容,如果未能解决你的问题,请参考以下文章

如何清除System.Runtime.Caching.MemoryCache

滑动过期 JWT 以防止用户注销

.net MemoryCache - 通知删除的项目

.Net Core MemoryCache PostEvictionCallback 无法正常工作

分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S C/S项目均可以使用!

如何清除 System.Runtime.Caching.MemoryCache