Guava Cache如何在TTL到期时自动删除键?
关于Guava Cache TTL到期删除逻辑的说明
Guava Cache不实现实时的TTL到期主动删除,它的过期清理依赖两种核心机制:
- 惰性删除:当调用
get()、getIfPresent()等方法访问键时,会先检查该键是否过期,若过期则直接删除并返回null(或触发加载逻辑)。这块逻辑在LocalCache.Segment的getEntry()方法中,会调用expireEntries()处理过期条目。 - 定时后台清理:如果配置了
refreshAfterWrite,或通过CacheBuilder.scheduler()指定了调度器,Guava会启动后台线程定期清理过期条目。核心逻辑在LocalCache的maintenance()方法中,后台线程会周期性调用该方法,遍历各segment执行expireEntries()完成批量清理。
- 惰性删除:当调用
找不到“到期立即删除”代码的原因:
Guava Cache的设计初衷是避免频繁后台扫描带来的性能损耗,它不会为每个键单独设置到期定时器触发删除,而是通过“懒加载时检查+批量定时清理”的组合方式处理过期,因此不存在“某个键一到期就执行删除”的独立代码逻辑。核心代码查看指引:
- 惰性删除逻辑:定位到
LocalCache.Segment.getEntry(Object key)方法,查看其中对expireEntries()的调用 - 定时清理逻辑:查看
LocalCache.maintenance()方法,以及CacheBuilder中调度器相关配置,后台线程会触发该维护方法执行清理
- 惰性删除逻辑:定位到
内容的提问来源于stack exchange,提问作者Qifan.y
相关产品推荐
相关产品推荐

