提问者:小点点

咖啡因缓存-多个过期配置


过期可以通过多种方式配置:

  • 写入后过期
  • 访问后过期
  • 过期后(过期)

虽然这3种方法看起来都很有帮助,但在内部它们配置了不同的缓存变量。我的问题是:拥有专用变量进行过期配置的目的是什么。乍一看,expireAfterWriteexpireAfterAccess可以重用expireAfter(EXPORYY)传递某个EXPORYY对象来实现。


共1个答案

匿名用户

这是因为变量过期,expireAfter,是后来在2.5.0版中引入的。正如您所提到的,如果该功能先出现,那么其他人就会重用它。不过,迁移似乎没有什么好处,所以它留作独立实现。懒惰可能是最好的答案。

变量出现较晚的原因是因为Caffeine只使用摊销的O(1)算法。当时的其他缓存使用O(lg n)优先级队列(堆、红黑色、ebtree、skiplist或基数树)来实现变量过期,或者强制设置最大大小并让死条目停留直到大小被驱逐。在这些方法中,缓存操作要么随着增长而变慢,要么污染会降低命中率。

据我所知,咖啡因是第一个使用分层计时轮的缓存。这是通过使用散列而不是比较来排序的算法是O(1)。该实现使用按位操作来提高效率,例如移位和掩码与除法和模数。这个结果是一个非常快速和可扩展的方法,可以与固定到期的算法(一个简单的LRU样式列表)相媲美。本文总结了细节。