如何处理Google Guava缓存刷新异常



Google Guava Cache文档指出:

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

如果刷新时抛出异常,则保留旧值,并且则会记录并接受异常。

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

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

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

然后,对get(key)的后续调用将同步委托给值加载器,并将重新引发由CacheLoader引发的任何异常,该异常封装在(Unchecked)ExecutionException中。

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

最新更新