Google Guava缓存文档指出:
刷新与驱逐并不完全相同。正如在LoadingCache.refresh(K)中指定的那样,刷新密钥会加载密钥的新值,可能是异步的。在刷新密钥时仍会返回旧值(如果有),与驱逐相反,驱逐会强制检索等待,直到重新加载该值。
如果在刷新时抛出异常,则保留旧值,并且 记录并吞下异常。
在我的用例中,这种异常的记录和吞没非常糟糕,因为这意味着如果刷新抛出异常,则缓存的用户将继续在缓存中找到陈旧数据。
如何确保在刷新时抛出异常,缓存开始返回null或调用load方法?
答案 0 :(得分:8)
如果您不想提供陈旧数据,则应拨打invalidate(key)
而不是refresh(key)
。这会丢弃key
的缓存值(如果存在)。
然后对get(key)
的后续调用将同步委托给值加载器,并将重新抛出CacheLoader
抛出的任何异常,包含在(Unchecked)ExecutionException
中。