Guava如何在CacheBuilder中过期?

Ced*_*tin 27 java collections caching map guava

我想使用CacheBuilder,如下所示:

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

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

番石榴是如何做到的,它会带来什么样的性能成本?

Lou*_*man 51

番石榴团队成员在这里.

Guava Cache实现在正常维护操作过程中使条目到期,这些条目在高速缓存写入操作期间以及有时在高速缓存读取操作期间基于每个段发生.参赛作品通常不是过期正是他们的过期时间,只是因为Cache使得故意决定不建立自己的维护线程,而是让用户决定是否需要持续维护.

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

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

  • Charles Fry在Strange Loop的MapMaker/CacheBuilder上做了精彩的演讲.这个演讲可以在[InfoQ]上找到(http://www.infoq.com/presentations/Concurrent-Caching-at-Google) (3认同)