Dotnet Core In Memory Cache - 默认过期时间是多少
Dotnet Core In Memory Cache - what is the default expiration
我在 dotnet 核心 C# 项目中使用 MemoryCache。我正在使用它存储我从 collection 中读出的枚举列表(我想存储它,因为它使用反射来加载需要时间的枚举)。
但是,由于我的 collection 不会更改,所以我根本不希望它过期。我怎么做?如果我不设置任何过期时间(SlidingExpiration 或 Absolute Expiration),我的缓存会永不过期吗?
如果您没有指定绝对 and/or 滑动过期,那么该项目理论上将无限期地保持缓存状态。实际上,持久性取决于两个因素:
内存压力。如果系统资源受限,并且 运行 应用程序需要额外的内存,则可以从内存中删除缓存项以释放 RAM。但是,您可以通过将条目的缓存优先级设置为 CacheItemPriority.NeverRemove
.
来禁用此功能
内存缓存受进程限制。这意味着如果您重新启动服务器或您的应用程序出于任何原因重新启动,存储在内存缓存中的任何内容都会消失。此外,这意味着在网络农场场景中,您的应用程序的每个实例都将拥有自己的内存缓存,因为每个实例都是一个单独的进程(即使您只是 运行 同一服务器上的多个实例)。
如果您只关心真正执行一次操作,并在应用程序关闭后持久保存结果,甚至跨应用程序的多个实例,您需要使用分布式缓存和后备存储,例如 SQL 服务器或Redis.
我在 dotnet 核心 C# 项目中使用 MemoryCache。我正在使用它存储我从 collection 中读出的枚举列表(我想存储它,因为它使用反射来加载需要时间的枚举)。
但是,由于我的 collection 不会更改,所以我根本不希望它过期。我怎么做?如果我不设置任何过期时间(SlidingExpiration 或 Absolute Expiration),我的缓存会永不过期吗?
如果您没有指定绝对 and/or 滑动过期,那么该项目理论上将无限期地保持缓存状态。实际上,持久性取决于两个因素:
内存压力。如果系统资源受限,并且 运行 应用程序需要额外的内存,则可以从内存中删除缓存项以释放 RAM。但是,您可以通过将条目的缓存优先级设置为
CacheItemPriority.NeverRemove
. 来禁用此功能
内存缓存受进程限制。这意味着如果您重新启动服务器或您的应用程序出于任何原因重新启动,存储在内存缓存中的任何内容都会消失。此外,这意味着在网络农场场景中,您的应用程序的每个实例都将拥有自己的内存缓存,因为每个实例都是一个单独的进程(即使您只是 运行 同一服务器上的多个实例)。
如果您只关心真正执行一次操作,并在应用程序关闭后持久保存结果,甚至跨应用程序的多个实例,您需要使用分布式缓存和后备存储,例如 SQL 服务器或Redis.