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

问题描述

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

  • expireAfterWrite
  • expireAfteraccess
  • expireAfter(到期)

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

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...