在我的应用程序中,我使用MemoryCache,但我不希望项目过期。因此,使用默认策略将项目插入缓存,而不设置AbsoulteExpiration
或SlidingExpiration
。
最近,在高服务器上,我遇到了缓存问题,因为它返回空值代替所需的值,之前插入缓存。事实证明,不仅有资格过期的项目(如明确设置过期日期的项目)也会从缓存中删除。在内存压力下,如果超过CacheMemoryLimit
和/或PhysicalMemoryLimit
的值,MemoryCache也会删除其他元素。
怎么预防这个?如何确定,当元素设置为缓存一次时,可以再次安全地从中获取它?
我考虑将PollingInterval
设置为一个巨大的值,但这只会延迟潜在的问题(并且在文档中将轮询间隔称为最大时间,而不是确切的或最小的时间)。将PhysicalMemoryLimitPercentage
设置为100%也无法解决问题,因为它引用了物理安装的内存而不是整个可用的虚拟内存。或者我错了,这确实有帮助吗?
CacheItemPolicy
有一个Priority
财产,可以设置为NotRemovable
。
但是,您需要知道使用此设置将多少数据添加到缓存中。将数据连续添加到缓存并永远不会删除它最终会导致内存或溢出问题。
通常在缓存中不再存在项目的情况下使用缓存,在这种情况下,再次从持久存储(例如,数据库或文件)中检索该值。
在您的情况下,听起来您的代码需要项目存在,这可能建议寻找另一种方法(例如,注释中提到的静态ConcurrentDictionary)。