番石榴缓存驱逐政策

Ale*_*kin 7 guava

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

Lou*_*man 20

Guava缓存被分段concurrencyLevel不同的哈希表,以允许多个并发读取和写入.默认concurrencyLevel值为4.基本上,如果maximumSize设置为100,那么实际上只会导致四个段中的每一个maximumSize得到25个.这就是maximumSize文档说明的原因:

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

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

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