Guava LoadingCache:为什么一起使用refreshAfterWrite和expireAfterWrite

时间:2017-09-10 18:49:26

标签: java guava google-guava-cache

我阅读本文档解释番石榴缓存:CachesExplained。我确实理解了refreshAfterWrite和expireAfterWrite正在做什么。但是,在解释refreshAfterWrite时,该文档还提到了这一点:

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

这是令我困惑的部分。根据我的理解,如果您想要自动刷新密钥,您只需要指定refreshAfterWrite。为什么我们甚至想在使用refreshAfterWrite时使用expireAfterWrite?

1 个答案:

答案 0 :(得分:8)

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

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

  

刷新与驱逐并不完全相同。正如在LoadingCache.refresh(K)中指定的那样,刷新密钥会加载密钥的新值,可能是异步的。在刷新密钥时仍会返回旧值(如果有),与驱逐相反,驱逐会强制检索等待,直到重新加载该值。