我想使用 CacheBuilder,这里推荐:
但是我不明白Guava 什么时候知道条目过期。
Guava 是如何做到这一点的,它会产生什么性能成本?
Guava 团队成员在这里。
GuavaCache
实现在正常维护操作过程中使条目过期,这在缓存写入操作期间以每个段为基础发生,偶尔在缓存读取操作期间发生。条目通常不会在确切的到期时间到期,只是因为Cache
故意决定不创建自己的维护线程,而是让用户决定是否需要持续维护。
我将专注于expireAfterAccess
,但过程expireAfterWrite
几乎相同。就机制而言,当您在 中指定expireAfterAccess
时CacheBuilder
,缓存的每个段都会为条目维护一个链表访问队列,按照从最近最少访问到最近访问的顺序排列。缓存条目实际上是链表中的节点,所以当一个条目被访问时,它会将自己从访问队列中的旧位置移除,并将自己移动到队列的末尾。
执行缓存维护时,缓存所要做的就是使队列前面的每个条目都过期,直到找到未过期的条目。这很简单并且需要相对较少的开销,并且它发生在正常的缓存维护过程中。(此外,缓存有意限制了单次清理中完成的工作量,从而最大限度地减少了任何单次缓存操作的费用。)通常,缓存维护的成本主要由计算缓存中实际条目的费用决定。