Guava如何使CacheBuilder中的条目到期?

我想使用CacheBuilder,如下所示:

带有过期密钥的基于Java时间的映射/缓存

但是我不明白Guava知道什么时候到期。

番石榴是如何做到的,它的性能成本是多少?

番石榴队成员在这里。

Guava Cache实现在正常维护操作过程中使条目到期,这些条目在高速缓存写入操作期间以及在高速缓存读取操作期间偶尔发生在每个段上。 条目通常在到期时间内没有过期,只是因为Cache故意决定不创建自己的维护线程,而是让用户决定是否需要持续维护。

我将重点关注expireAfterAccess ,但expireAfterAccess的过程几乎完全相同。 就机制而言,当您在CacheBuilder指定expireAfterAccess时,缓存的每个段都按照从最近访问到最近访问的顺序维护条目的链表访问队列。 高速缓存条目实际上是链接列表中的节点,因此当访问条目时,它将自己从访问队列中的旧位置移除,并将其自身移动到队列的末尾。

执行缓存维护时,所有缓存所要做的就是使队列前面的每个条目到期,直到找到未到期的条目。 这很简单并且需要相对较少的开销,并且它发生在正常的高速缓存维护过程中。 (此外,缓存故意限制单次清理中完成的工作量,最大限度地减少任何单个缓存操​​作的开销。)通常,缓存维护的成本主要是计算缓存中实际条目的开销。