java - Guava 加载缓存 : Why use refreshAfterWrite and expireAfterWrite together

标签 java guava google-guava-cache

我阅读了这篇解释 Guava 缓存的文档:CachesExplained .我确实了解 refreshAfterWrite 和 expireAfterWrite 在做什么。但是,文档在解释refreshAfterWrite的同时,也提到了这一点:

因此,例如,您可以在同一缓存上同时指定 refreshAfterWrite 和 expireAfterWrite,这样只要条目符合刷新条件,就不会盲目地重置条目的过期计时器,因此如果条目达到刷新条件后不再查询,允许过期。

这是让我感到困惑的部分。我的理解是,如果想让某个key自动刷新,只需要指定refreshAfterWrite即可。为什么我们甚至想在使用 refreshAfterWrite 时使用 expireAfterWrite?

最佳答案

在某些情况下,您希望缓存的条目具有相关性,因此您设置了刷新持续时间(这可能更容易执行(和异步),而不是在逐出后完全获取,因此不同),但是同时,如果你的缓存是有界的,你会想要驱逐条目,这就是 expireAfterWrite 的目的。通过同时设置它们,您将确保条目在特定时间后被逐出,即使它已被刷新。

另请注意,两者的操作方式不同:

Refreshing is not quite the same as eviction. As specified in LoadingCache.refresh(K), refreshing a key loads a new value for the key, possibly asynchronously. The old value (if any) is still returned while the key is being refreshed, in contrast to eviction, which forces retrievals to wait until the value is loaded anew.

关于java - Guava 加载缓存 : Why use refreshAfterWrite and expireAfterWrite together,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46144341/

相关文章:

java.lang.NoClassDefFoundError : com/google/common/base/internal/Finalizer$ShutDown (wrong name: com/google/common/base/internal/Finalizer)

java - 使用 Guava Collections2 转换方法作为 Apache CollectionUtil.forAllDo

java - 空 Guava 缓存大小?

java - google guava 缓存 invalidateAll() 和 cleanUp() 之间的区别

java - 在java中创建单链表后如何返回到它的头部?

java - 如何使用带有 OpenCV 的 Java 从边界框读取文本

java - 如何: Find all references to a Field in Java

java - 在未知值之前对具有已知值的列表进行排序

Java 8 : Fetching selective request parameters