番石榴缓存驱逐政策

时间:2012-04-19 20:16:55

标签: guava

我最近尝试过番石榴缓存,并对驱逐政策感到惊讶。虽然缓存在文档中明确表示为lru,但它并非事实。对我来说,我的测试表明,驱逐看起来是随机的。 (测试是添加100个etnries,获得100个条目,设置不同的100个条目,检查驱逐顺序)我不想在运行时检测到一些意外的驱逐。您能否为尺寸限制缓存的驱逐政策提供一些背景知识。我怎样才能强制番石榴缓存像LHM一样驱逐?

1 个答案:

答案 0 :(得分:20)

将番石榴缓存分段concurrencyLevel个不同的哈希表中,以允许多个并发读写。默认concurrencyLevel为4.基本上,如果您的maximumSize设置为100,那么实际上只会导致四个细分中的每一个都得到25的maximumSize。这就是maximumSize文档陈述的原因:

  

请注意,缓存可能会在超出此限制之前逐出条目。随着缓存大小接近最大值,缓存会逐出不太可能再次使用的条目。

因此,如果偶然的话,有30个条目进入一个特定的段,那么其中5个条目将被驱逐。

获得Cache全局最近访问驱逐的唯一方法是通过设置concurrencyLevel(1)来完全关闭并发。即使这样,文档也没有对元素的驱逐顺序进行任何保证,你不应该依赖它。