作者:袁甲2012_498 | 来源:互联网 | 2022-12-03 01:09
我在dotnet核心C#项目中使用MemoryCache。我正在使用它存储我从集合中读取的枚举列表(我想存储它,因为它使用反射来加载枚举,这需要时间)。
但是,由于我的收藏集不会改变,所以我根本不希望它过期。我怎么做?如果我没有设置任何过期时间(SlidingExpiration或Absolute Expiration),我的缓存将永不过期吗?
1> Chris Pratt..:
如果您未指定绝对和/或滑动到期时间,则该项目理论上将无限期保留缓存。实际上,持久性取决于两个因素:
记忆压力。如果系统资源受限,并且正在运行的应用程序需要额外的内存,则可以从内存中删除缓存的项目以释放RAM。不过,您可以通过将条目的缓存优先级设置为来禁用此功能CacheItemPriority.NeverRemove
。
内存缓存是进程绑定的。这意味着,无论出于何种原因重新启动服务器或应用程序重新启动,存储在内存缓存中的所有内容都将消失。另外,这意味着在Web场方案中,应用程序的每个实例将拥有自己的内存缓存,因为每个实例都是单独的进程(即使您只是在同一服务器上运行多个实例)。
如果您只关心一次真正执行操作,并且在应用程序关闭后甚至在应用程序的多个实例之间都保留结果,则需要对SQL Server或Redis等后备存储使用分布式缓存。
因为.NET Core MemoryCache实际上并不支持对内存压力的自动逐出。新建议是确定您自己的压缩参数,并根据需要手动启动它。如果您不这样做,那么您将继续消耗更多的内存并开始分页数据,从而使所有内容都进行爬网。
另请参见此处,“ CompactOnMemoryPressure”现在已过时:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.caching.memory.memorycacheoptions.compactonmemorypressure?view=aspnetcore-2.2