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

时间:2020-10-18 14:15:44

标签: java caffeine

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

  • expireAfterWrite
  • expireAfterAccess
  • expireAfter(到期)

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

1 个答案:

答案 0 :(得分:1)

这是因为变量过期expireAfter在2.5.0版中稍后引入。如前所述,如果该功能首先出现,那么其他功能将重用它。但是,通过迁移似乎并没有太大的收获,因此将其作为独立的实现保留。懒惰可能是最好的答案。

变量之所以迟到是因为咖啡因仅使用了摊销的O(1)算法。当时的其他缓存使用O(lg n)优先级队列(堆,redblack,ebtree,skiplist或基数树)来实现变量到期,或者强制使用最大大小并让无效条目徘徊直到退出大小为止。在这些方法中,缓存操作随着增长而变慢,或者污染会降低命中率。

据我所知,咖啡因是第一个使用分层定时轮的缓存。这是使用散列而不是比较进行排序的O(1)算法。该实现使用按位运算以提高效率,例如位移和遮罩与划分和模数的关系。此结果是一种非常快速且可扩展的方法,可与固定到期的算法(简单的LRU样式列表)相比。详细信息汇总在此article中。