Google Guava Cache文档指出:
刷新并不完全等同于驱逐。正如LoadingCache.refresh(K)中所指定的,刷新键会为该键加载一个新值,可能是异步的。在刷新密钥时,仍会返回旧值(如果有的话),而驱逐则强制检索等待,直到重新加载该值。
如果刷新时抛出异常,则保留旧值,并且则会记录并接受异常。
在我的用例中,这种异常的日志记录和吞噬非常糟糕,因为这意味着如果刷新引发异常,缓存的用户将继续在缓存中找到过时的数据。
如何确保在刷新时抛出异常,缓存开始返回null或调用load方法?
如果您从不想为过时的数据提供服务,那么应该调用invalidate(key)
而不是refresh(key)
。这将丢弃key
的缓存值(如果存在)。
然后,对get(key)
的后续调用将同步委托给值加载器,并将重新引发由CacheLoader
引发的任何异常,该异常封装在(Unchecked)ExecutionException
中。
如果陈旧数据对您来说是个问题,那么您应该使用expireAfterWrite
来确保从不提供陈旧数据。