答案 0 :(得分:48)
番石榴团队成员。
Guava Cache
实现在正常维护操作过程中使条目到期,这些条目在高速缓存写入操作期间以及在高速缓存读取操作期间偶尔发生。条目通常在完全过期时间内没有过期,只是因为Cache
故意决定不创建自己的维护线程,而是让用户决定是否需要持续维护
我将专注于expireAfterAccess
,但expireAfterWrite
的程序几乎完全相同。就机制而言,当您在expireAfterAccess
中指定CacheBuilder
时,缓存的每个段都按照从最近访问到最近访问的顺序为条目维护链接列表访问队列。缓存条目实际上是链表中的节点,因此当访问条目时,它会将自己从访问队列中的旧位置移除,并将自身移动到队列的末尾。
执行缓存维护时,所有缓存所要做的就是使队列前面的每个条目到期,直到找到未到期的条目。这很简单,并且需要相对较少的开销,并且它发生在正常的缓存维护过程中。 (此外,缓存故意限制单次清理中完成的工作量,最大限度地降低任何单个缓存操作的开销。)通常,缓存维护的成本主要是计算缓存中实际条目的开销。