[英]Guava CacheLoader - invalidate does not immediately invalidate entry if both expireAfterWrite and expireAfterAccess are set
[英]invalidate refreshed entry in Guava CacheLoader
我有一个带CacheLoader
的Guava缓存。 我在一个线程中跟踪一个外部条件,如果发生这种情况,我想异步refresh()
所有条目。 出于这个原因,我不使用invalidateAll()
因为下一个get()
必须等待加载成功。
相反,我迭代缓存中包含的键并refresh(k)
所有这些键,因为我找不到refreshAll()方法。 这是代码(但与问题无关):
Set<ResourceLoaderKey> keys = resourceLoaderCache.asMap().keySet();
for(ResourceLoaderKey k : keys)
{
resourceLoaderCache.refresh(k);
}
我现在的问题是,CacheLoader中的reload()
可能检测到资源实际上不再可用。 目前reload()
抛出一个适用于get()
情况的ResourceNotFound异常。 但它不适用于refresh()
情况,因为只要reload()
失败就会提供旧值。
我现在可以在加载/重新加载方法中捕获未找到的异常并以某种方式使条目无效,但我想知道是否有正式方法(返回null或null将被记录为警告并被忽略)? 能够删除键/缺席值而不是保留占位符对象会很好。
番石榴r17目前不支持这种方法。
您是否尝试过获取所有密钥,然后使所有密钥无效,然后尝试获取您保存的所有密钥?
Set<ResourceLoaderKey> keys = resourceLoaderCache.asMap().keySet();
resourceLoaderCache.invalidateAll(keys);
for(ResourceLoaderKey k : keys) {
resourceLoaderCache.get(k); //or getUnchecked() whichever you prefer
}
这应该确保没有过时的值保留在缓存中,并重新存储所有存在的值。
(我的问题略有不同,我不得不改变我的假设来解决我的问题)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.