gpt4 book ai didi

java - Caffeine Cache.asMap View 的行为

转载 作者:行者123 更新时间:2023-11-30 06:21:05 28 4
gpt4 key购买 nike

Javadoc说:

Returns a view of the entries stored in this cache as a thread-safe map. Modifications made to the map directly affect the cache.

我缺少的是有关 View 访问是否会影响准入和驱逐政策的信息。根据this old related issue它没有:

In Guava's CacheBuilder we added the asMap() view specifically to allow bypassing the cache management routines. There a cache.asMap().get(key) is a peek operation.

这确实有道理。 OTOH 该 View 提供了许多无法直接操作的操作,用户可能会想使用它们,希望它们像直接操作一样更新访问统计信息。

例如,我发现自己使用cache.asMap().putIfAbsent,因为我的值是键的函数,因此替换它们是没有意义的。我希望它能够像 cache.put 一样工作,以防条目不存在。

最佳答案

这是 Guava 的 Map.get 最初讨论的一部分,但很可能是一个糟糕的主意,沟通不畅,最终失败了。一个合理的原因是,用户没有预料到大多数 Map 操作会产生副作用,而 MapMaker 会随着 map 的计算而改变,从而破坏了 equals 方法。

回想起来,将任何 Map 方法视为不同的方法都违反了最小惊讶原则,并且不是很有用。这很可能是在实现过程中实现的,但由于团队脱节和大量细节,我忘记了这一点。我们还决定了这样的原则:用户不需要知道策略如何工作,也不需要通过配置旋钮来影响其实现,而安静的 get 会暴露这些。

然而,无论好坏,一个方面确实存在。与Cache.getIfPresent不同,Map.get不会记录命中率统计信息。同样,对于所有其他 Map 操作,它们可能会选择不更新 CacheStats。在 Guava 中,这被表述为,

No stats are modified by operations invoked on the asMap view of the cache.

这在 Caffeine 中针对其他 Java 8 方法进行了稍微修改,

No stats are modified by non-computing operations invoked on the 
asMap view of the cache.

这种选择退出统计数据的行为本不应该发生,但这是最初讨论的残余。这是一个微妙的细节,可能不会被完全尊重,因为我相信 Guava 添加的计算 Map 方法没有这样做。值得庆幸的是,这是一个足够小的细节,没有引起很多问题,如果认为值得的话可以进行更改。

关于java - Caffeine Cache.asMap View 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139062/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com