Asp.NET Core应用启动/重启时如何持久化IMemoryCache缓存数据
问题解答
1. 认知纠正
你对IMemoryCache的理解确实存在偏差:IMemoryCache是进程内内存缓存,所有数据直接存储在当前应用进程的运行内存中,网站重启、停止调试都会销毁原有进程,内存空间直接释放,缓存条目自然全部清空。新启动的进程会初始化全新的IMemoryCache实例,不可能继承旧进程的缓存数据,所以你预期重启后缓存还存在的情况不可能发生。
你提到的类似问题的解答仅能解决应用启动时缓存成功初始化的问题,无法解决应用重启后缓存丢失的核心需求,因为不管在启动流程的哪个环节写入缓存,新进程的缓存实例都是空白的,无法继承旧进程的内存数据。
2. 实现重启不丢失缓存的方案
要实现缓存留存至少20分钟、不受应用启停影响,必须使用独立于应用进程的存储方案,可选方案如下:
- 分布式缓存(推荐):使用Redis作为缓存存储,缓存数据存在独立的Redis服务进程中,和你的网站进程完全隔离,应用重启完全不影响缓存数据。ASP.NET Core原生支持IDistributedCache接口的Redis实现,只需要修改服务注册逻辑即可替换原有IMemoryCache的逻辑,缓存过期时间直接设置20分钟就能满足需求。
注册示例:// ConfigureServices中添加 services.AddStackExchangeRedisCache(options => { options.Configuration = "你的Redis连接字符串"; options.InstanceName = "你的缓存实例前缀"; }); - 本地持久化缓存:如果是单服务器部署、不想搭建Redis,可以使用支持磁盘持久化的第三方缓存库(比如EasyCaching的磁盘缓存实现),缓存数据会写入本地磁盘,应用重启后可以读取磁盘上的缓存数据恢复。
3. Program.cs与Configure方法操作缓存的差异
两者的核心区别是执行时机属于应用生命周期的不同阶段:
- Program.cs的缓存操作执行时机更早:在应用主机构建完成、服务注册完毕后就可以执行,早于中间件管道配置环节,适合需要在中间件运行、服务启动前就需要用到的缓存初始化场景,不会出现中间件读取缓存时还没初始化的问题。
- Configure方法属于中间件管道配置阶段,缓存初始化操作在管道配置过程中执行,如果注册在前面的中间件需要使用该缓存,会出现缓存还没初始化就读取不到的问题。
另外你现有代码里设置的entryA绝对过期时间只有10秒,就算不重启网站,10秒后也会自动过期,要留存20分钟需要把SetAbsoluteExpiration(TimeSpan.FromSeconds(10))修改为SetAbsoluteExpiration(TimeSpan.FromMinutes(20))。
内容的提问来源于stack exchange,提问作者user575219
相关产品推荐
相关产品推荐

