内存缓存中的 Dotnet Core - 默认到期时间是啥

Posted

技术标签:

【中文标题】内存缓存中的 Dotnet Core - 默认到期时间是啥【英文标题】:Dotnet Core In Memory Cache - what is the default expiration内存缓存中的 Dotnet Core - 默认到期时间是什么 【发布时间】:2019-03-11 00:45:59 【问题描述】:

我在 dotnet core C# 项目中使用 MemoryCache。我正在使用它存储我从集合中读取的枚举列表(我想存储它,因为它使用反射来加载需要时间的枚举)。

但是,由于我的收藏不会改变,我根本不希望它过期。我怎么做?如果我不设置任何过期时间(SlidingExpiration 或 Absolute Expiration),我的缓存是否永远不会过期?

【问题讨论】:

【参考方案1】:

如果您未指定绝对和/或滑动到期,则理论上该项目将无限期地保持缓存。实际上,持久性取决于两个因素:

    内存压力。如果系统资源受限,并且正在运行的应用程序需要额外的内存,则可以从内存中删除缓存的项目以释放​​ RAM。但是,您可以通过将条目的缓存优先级设置为 CacheItemPriority.NeverRemove 来禁用此功能。

    内存缓存受进程限制。这意味着如果您重新启动服务器或您的应用程序由于任何原因重新启动,存储在内存缓存中的任何内容都会消失。此外,这意味着在网络农场场景中,您的应用程序的每个实例都将拥有自己的内存缓存,因为每个实例都是一个单独的进程(即使您只是在同一台服务器上运行多个实例)。

    李>

如果您只关心真正执行一次操作,并将结果保存到应用关闭后甚至跨应用的多个实例,您需要使用分布式缓存和 SQL Server 或 Redis 等后备存储。

【讨论】:

如果没有明确设置大小限制,.NET Core 缓存似乎不会驱逐内存压力并且无限增长。 因为 .NET Core MemoryCache 实际上并不支持自动驱逐内存压力。新的建议是确定您自己的压缩参数,并根据需要手动启动它。如果您不这样做,那么您将继续使用更多内存并开始分页数据,从而使所有内容都陷入困境。 另见此处,CompactOnMemoryPressure 现已过时:docs.microsoft.com/en-us/dotnet/api/… 我明白了。它曾经自动发生,但不再自动发生。当他们做这样的事情时真的很糟糕。我并没有真正使用内存缓存(总是使用 Redis),所以没有意识到这已经改变了。感谢您的更新。 是的,这个答案不正确。 Asp.Net Core 对 MemoryCache 的更改已经够糟糕了,我认为它不是缓存。它不响应内存压力,所以它只是一个字典。应该重命名。更新此答案以反映没有内存压力驱逐的事实,我将取消投票。

以上是关于内存缓存中的 Dotnet Core - 默认到期时间是啥的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 2.x 中的默认会话到期时间是多少?

ASP.NET Core 中的 dotnet-trace 不显示控制器的任何方法

dotnet core 托管

Cache 或 MultiMap 用于基于天的缓存到期?

相当于 dotnet core/csproj 中的 AssemblyInfo

通过 azure-sdk-dotnet 查询 Azure 应用密码的过期日期