如何设置MemoryCache的超时?现有两处配置是否正确?
问题解答:MemoryCache配置合理性分析
配置正确性说明
你的配置是完全正确的,两处设置的并非同一类“超时”,作用完全不同,不存在重复或不合理的情况。
两个参数的核心区别
1. MemoryCacheOptions.ExpirationScanFrequency
这是缓存的全局后台扫描频率,作用是:
- 控制系统每隔多久自动检查一次所有缓存条目,找出已经过期的条目并清理释放内存
- 设置为
TimeSpan.FromMinutes(5)意味着后台每5分钟执行一次过期缓存的扫描清理操作 - 这个参数是针对整个缓存实例的全局配置,和单个缓存项的过期时间无关
2. MemoryCacheEntryOptions.AbsoluteExpirationRelativeToNow
这是单个缓存项的绝对过期时间,作用是:
- 定义当前存入的缓存项(比如这里的
Keys.Users)从存入时刻开始,经过多久后会变为过期状态 - 设置为
TimeSpan.FromMinutes(5)意味着listAllUsers这个数据存入缓存后,5分钟后就会标记为过期,等待下次后台扫描时被清理 - 这个参数可以针对不同的缓存项单独设置,比如你可以给其他缓存项设置10分钟、1小时的过期时间,灵活性很高
为什么需要同时设置?
- 缓存项的过期时间决定了数据能在缓存里存多久,保证数据的时效性
- 后台扫描频率决定了过期数据会在多久内被实际清理掉,平衡内存占用和系统性能:扫描太频繁会增加CPU开销,太晚会导致过期数据长时间占用内存
举个实际场景:如果你的缓存项设置5分钟过期,但扫描频率设为10分钟,那么过期的缓存项最多会在内存里多待5分钟(从过期到下一次扫描清理的时间),这是合理的权衡。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

