【发布时间】:2018-05-10 23:07:32
【问题描述】:
在我的应用程序中,我使用 MemoryCache,但我不希望项目过期。因此,项目使用默认策略插入到缓存中,而不设置 AbsoulteExpiration 或 SlidingExpiration。
最近,在最后的高端服务器上,我遇到了缓存问题,因为它返回空值而不是之前插入到缓存中的所需值。事实证明,不仅可以从缓存中删除符合过期条件的项目(如明确设置了过期日期的项目)。在内存压力下,当超过CacheMemoryLimit 和/或PhysicalMemoryLimit 的值时,MemoryCache 也会删除其他元素。
如何预防?如何确定,当元素被设置一次缓存时,它可以安全地再次从中获取?
我考虑将PollingInterval 设置为某个巨大的值,但这只会延迟潜在的问题(并且轮询间隔在文档中被引用为最大时间,而不是确切或最小时间)。将PhysicalMemoryLimitPercentage 设置为 100% 也不能解决问题,因为它引用的是物理安装的内存,而不是整个可用的虚拟内存。还是我错了,它确实会有所帮助?
【问题讨论】:
-
您的问题指示我们建议增加 RAM 或定期从缓存中删除一些值。你不能永远填满缓存。
-
也许您想改用静态 ConcurrentDictionary?
-
CacheItemPolicy有一个Priority 属性,可以设置为NotRemovable。 -
谢谢@EricB,我不知何故错过了这个设置,这正是我需要的。
-
我添加了我的评论的扩展版本作为答案,因为它解决了您的问题,并帮助其他人在未来找到它。
标签: c# .net caching polling memorycache