MemoryCache同时设置AbsoluteExpiration与SlidingExpiration的行为疑问
关于MemoryCache(及LazyCache)过期策略的问题解答
一、创建MemoryCache时的配置理解
- 你的理解完全正确:创建
MemoryCache实例时,仅能通过MemoryCacheOptions.ExpirationScanFrequency设置缓存过期条目的轮询清理间隔,无法全局统一设置缓存条目的过期时间。所有缓存条目的过期规则,必须在调用Add/Set(LazyCache中为Add/GetOrAdd)方法时,通过CacheEntryOptions(对应MemoryCache的MemoryCacheEntryOptions)为每个条目单独配置。
二、同时设置绝对过期与滑动过期的行为
- 你的测试结果准确:当同时为缓存条目设置
AbsoluteExpirationRelativeToNow(比如15分钟)和SlidingExpiration(比如20秒)时,任一条件满足即触发过期:- 即使条目被高频访问(比如每秒调用
Get()),只要到达15分钟的绝对过期时间,条目就会失效; - 如果连续21秒没有被访问,无论是否到达15分钟的绝对过期时间,条目也会失效。
- 即使条目被高频访问(比如每秒调用
- 该行为并非可变更的实现细节,而是.NET MemoryCache的规范行为,官方设计逻辑就是两种过期策略取“先触发者”,这个规则是稳定且长期有效的,不会随意更改。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

