Asp.net core mvc 内存缓存中的Dotnet核心-默认过期时间是多少

Asp.net core mvc 内存缓存中的Dotnet核心-默认过期时间是多少,asp.net-core-mvc,memorycache,Asp.net Core Mvc,Memorycache,我在一个dotnet核心C#项目中使用MemoryCache。我正在使用它存储从集合中读取的枚举列表(我想存储它,因为它使用反射加载枚举,这需要时间) 然而,由于我的收藏不会改变,我根本不想让它过期。我该怎么做?如果我没有设置任何过期(滑动过期或绝对过期),我的缓存是否永远不会过期?如果您没有指定绝对过期和/或滑动过期,则从理论上讲,项目将无限期地保持缓存。实际上,持久性取决于两个因素: 内存压力。如果系统资源受限,并且正在运行的应用程序需要额外的内存,则可以从内存中删除缓存项以释放RAM。但是

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


然而,由于我的收藏不会改变,我根本不想让它过期。我该怎么做?如果我没有设置任何过期(滑动过期或绝对过期),我的缓存是否永远不会过期?

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

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

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


  • 如果您只关心真正执行一次操作,并在应用程序关闭后,甚至在应用程序的多个实例中,保持结果不变,您需要将分布式缓存与SQL Server或Redis之类的备份存储一起使用。

    如果未明确设置大小限制,.NET核心缓存似乎不会因内存压力而退出,并且会无限增长。这取决于您所说的边界。如果没有对内存的竞争,理论上它将扩展到100%的内存利用率。实际上,这一限制会更低,但我不确定你从哪里得到这样的想法:如果有实际需要,它将不会退出。因为.NET Core MemoryCache实际上不支持在内存压力下自动退出。新的建议是确定自己的压实参数,并根据需要手动启动。如果不这样做,您将继续使用更多内存并开始分页数据,使所有内容都处于爬行状态。它过去是自动发生的,但现在不再发生了。当他们做那样的事情时真的很糟糕。我并不真正使用内存缓存(总是使用Redis),所以我没有意识到这已经改变了。谢谢你的更新。