MemoryCache - 防止项目过期

10
在我的应用程序中,我使用了MemoryCache,但我不希望缓存项过期。因此,这些项是在默认策略下插入到缓存中的,没有设置AbsoulteExpiration或SlidingExpiration。
最近,在高负载服务器上,我的缓存出现了问题,它返回null值而不是之前插入缓存中的期望值。后来发现,除了那些明确设置了过期日期的元素外,其他元素也会被从缓存中删除。当内存压力大时,当CacheMemoryLimit和/或PhysicalMemoryLimit的值超过时,MemoryCache也会删除其他元素。
如何防止这种情况?如何确保将元素设置到缓存中后,可以安全地再次从中获取它?
我考虑将PollingInterval设置为一个巨大的值,但这只会延迟潜在的问题(并且在文档中引用的轮询间隔是最大时间,而不是确切或最小时间)。将PhysicalMemoryLimitPercentage设置为100%也无法解决问题,因为它仅引用物理安装的内存而不是整个可用虚拟内存。或者我错了,它真的有帮助吗?

1
您的问题引导我们建议增加RAM或定期从缓存中删除一些值。您不能永远填充缓存。 - lucky
1
也许你想使用静态的ConcurrentDictionary? - Magnus
CacheItemPolicy有一个Priority属性,可以设置为NotRemovable - Eric B
谢谢@EricB,我不知道这个设置,但这正是我需要的。 - Wojtek
我已经将我的评论扩展成了答案,因为它解决了你的问题,并且可以帮助其他人在未来找到它。 - Eric B
1个回答

14

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

但需要注意的是,在使用此设置时应该考虑添加到缓存中的数据量,连续添加数据到缓存而不删除会最终导致内存或溢出问题。

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

在你的情况下,似乎你的代码要求项存在,这可能意味着需要寻找另一种方法(例如评论中提到的静态ConcurrentDictionary)。


CacheItemPolicy 只影响在内存压力驱逐期间是否清除缓存项;而不是过期。 - user4893106

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接