10

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

"因此,例如,您可以在同一个缓存中同时指定 refreshAfterWrite 和 expireAfterWrite ,这样每当条目符合刷新条件时,条目的过期计时器就不会被盲目重置,因此,如果在之后没有查询条目符合刷新条件,允许过期。

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

4

1 回答 1

16

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

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

刷新与驱逐并不完全相同。正如 LoadingCache.refresh(K) 中所指定的,刷新一个键会为该键加载一个新值,可能是异步的。刷新键时仍会返回旧值(如果有),这与驱逐相反,驱逐强制检索等到重新加载值。

于 2017-09-10T19:01:14.663 回答