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

Java 咖啡因缓存-多个过期配置,java,caffeine,Java,Caffeine,可以通过多种方式配置过期: 过期后写入 过期后访问 到期日(到期日) 虽然这三种方法看起来都很有用,但它们在内部配置了不同的缓存变量。 我的问题是:为过期配置专用变量的目的是什么。乍一看,expireAfterWrite和expireAfterAccess可以通过重用expireAfter(Expiry)传递某个过期对象来实现。这是因为变量expiration,expireAfter是在2.5.0版的后面引入的。如您所述,如果该功能是首先出现的,那么其他人就会重用它。不过,通过迁移似乎并没有

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

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

这是因为变量expiration,
expireAfter
是在2.5.0版的后面引入的。如您所述,如果该功能是首先出现的,那么其他人就会重用它。不过,通过迁移似乎并没有什么好处,所以只剩下独立的实现。懒惰可能是最好的答案

变量来得晚的原因是咖啡因只使用摊销O(1)算法。当时的其他缓存使用O(lg n)优先级队列(heap、redblack、ebtree、skiplist或radix tree)实现变量过期,或者强制设置最大大小,并让死区条目一直保留,直到大小收回。在这些方法中,要么缓存操作随着其增长而变慢,要么污染会降低命中率


据我所知,咖啡因是第一个使用分级计时轮的缓存。这是一个O(1)算法,它使用散列而不是比较来排序。该实现使用位运算来提高效率,例如移位和掩码与除法和模的比较。此结果是一种非常快速且可扩展的方法,与fixed expiration的算法(简单的LRU样式列表)相当。详细信息在此进行了总结。

这是因为变量expiration,
expireAfter
在2.5.0版的后面引入。如您所述,如果该功能是首先出现的,那么其他人就会重用它。不过,通过迁移似乎并没有什么好处,所以只剩下独立的实现。懒惰可能是最好的答案

变量来得晚的原因是咖啡因只使用摊销O(1)算法。当时的其他缓存使用O(lg n)优先级队列(heap、redblack、ebtree、skiplist或radix tree)实现变量过期,或者强制设置最大大小,并让死区条目一直保留,直到大小收回。在这些方法中,要么缓存操作随着其增长而变慢,要么污染会降低命中率


据我所知,咖啡因是第一个使用分级计时轮的缓存。这是一个O(1)算法,它使用散列而不是比较来排序。该实现使用位运算来提高效率,例如移位和掩码与除法和模的比较。此结果是一种非常快速且可扩展的方法,与fixed expiration的算法(简单的LRU样式列表)相当。详细信息在此进行了总结。

感谢您的精彩解释!谢谢你的解释!