Guava Cache遍历cache.asMap().values()是否会重置条目访问时间?
Guava Cache遍历asMap().values()是否会重置访问时间?
答案是“否”,完全符合你的期望。
具体细节:
- Guava Cache通过
cache.asMap()返回的是缓存的视图对象,遍历这个视图的values()集合时,只是读取缓存条目的值,不会触发缓存的“访问”逻辑,也就不会更新对应条目的最后访问时间。 - 只有通过
Cache.get()、Cache.put(),或者直接调用asMap().get(key)这类明确的“获取/更新”操作时,才会重置对应条目的访问时间。 - 这种设计是有意为之的——Guava团队考虑到遍历缓存通常用于监控、统计这类场景,不应该干扰原本的过期策略,避免一次遍历就让所有缓存条目“续命”,打破
expireAfterAccess的预期行为。
你可以做个简单测试验证:
- 创建一个
expireAfterAccess设为10秒的缓存 - 放入几个测试条目
- 等待5秒后遍历
asMap().values() - 再等待6秒后尝试获取这些条目,会发现它们已经过期被清除,这就证明遍历没有重置访问时间。
内容的提问来源于stack exchange,提问作者Brandon E Taylor
相关产品推荐
相关产品推荐

