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