Caffeine 缓存 - 多个过期配置

Caffeine cache - multiple expire configurations

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

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

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

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

据我所知,Caffeine 是第一个使用分层计时轮的缓存。这个算法是 O(1) 的,通过使用散列而不是比较来排序。该实现使用按位运算来提高效率,例如移位和掩码与除法和模数。该结果是一种非常快速且可扩展的方法,可与固定过期算法(简单的 LRU 样式列表)相媲美。详情总结在这个article.