6

Google Guava Cache 文档指出:

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

如果刷新时抛出异常,则保留旧值,并记录并吞下异常。

这种记录和吞咽异常在我的用例中非常糟糕,因为这意味着如果刷新引发异常,缓存的用户将继续在缓存中找到陈旧的数据。

如何确保刷新时引发异常,缓存开始返回 null 或调用 load 方法?

4

2 回答 2

8

如果您不想提供过时的数据,您应该调用invalidate(key)而不是refresh(key). 这将丢弃 的缓存值key(如果存在)。

然后后续调用get(key)将同步委托给值加载器,并将重新抛出由CacheLoader, 包裹在(Unchecked)ExecutionException.

于 2012-07-25T02:25:06.590 回答
1

如果陈旧数据对您来说是个问题,那么您应该使用它expireAfterWrite来确保永远不会提供陈旧数据。

于 2012-07-27T14:48:54.203 回答