1

https://www.javadoc.io/doc/com.github.ben-manes.caffeine/caffeine/1.0.0/com/github/benmanes/caffeine/cache/Caffeine.html#maximumSize-long-

表示 maximumSize() 指定缓存可能包含的最大条目数。请注意,缓存可能会在超出此限制之前驱逐条目。

它会表现出与我们在 GuavaCache 中看到的相同的行为,因为默认 ConcurrencyLevel 为 4 ,因此最大计数远低于预期?

4

1 回答 1

1

这种措辞是为了提供实施灵活性。在最新版本中,它显示,

请注意,缓存可能会在超过此限制之前驱逐条目,或者在驱逐时暂时超过阈值。

Guava 使用分段哈希表,其中每个段独立驱逐。这会导致从一个段中逐出,即使另一个段中有可用空间,因为它们是独立的。由于耦合到哈希表中,它还确保了即使是暂时的,段也不会超过其限制。

Caffeine 不会对驱逐策略进行分段,也不会使用自定义哈希表。这允许它在触发驱逐之前达到全部容量,但确实意味着它将暂时超过最大值。哈希表和驱逐策略是解耦的,在哈希表上发生写入,然后通过writeBuffer. 这是一个有界缓冲区,会立即耗尽,但如果它以某种方式被填充,则会对写入者产生背压,以允许驱逐跟上。因此,高速缓存在负载下可能会超过最大值,但不会出现失控增长。

迁移指南总结了需要注意的重要变化。

最大尺寸(或加权尺寸)

Guava 将在使用 LRU 算法达到最大大小之前驱逐。一旦使用 Window TinyLFU 算法超过阈值,咖啡因就会被驱逐。

于 2020-01-05T10:49:42.533 回答