27

我想使用 CacheBuilder,这里推荐:

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

但是我不明白Guava 什么时候知道条目过期。

Guava 是如何做到这一点的,它会产生什么性能成本?

4

1 回答 1

56

Guava 团队成员在这里。

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

我将专注于expireAfterAccess,但过程expireAfterWrite几乎相同。就机制而言,当您在 中指定expireAfterAccessCacheBuilder,缓存的每个段都会为条目维护一个链表访问队列,按照从最近最少访问到最近访问的顺序排列。缓存条目实际上是链表中的节点,所以当一个条目被访问时,它会将自己从访问队列中的旧位置移除,并将自己移动到队列的末尾。

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

于 2012-04-13T16:15:26.233 回答