[英]Google Guava cache auto remove value of Optional.absent()
是否可以使用Optional.absent()值自动逐出记录? 在某些应用程序中,Optional.absent()可能不是某些键的值。 例如,如果应用程序包含http调用,其中键可以是某些字符串,并且值是从http调用返回的响应,则由于网络问题或身份验证失败,http调用可以返回一些无效值(例如null),然后可以使用缓存中的键将invalid保存为Optional.absent()。 稍后,如果解决了网络和身份验证问题,则key-> invalidValue仍保留在缓存中。 解决此问题的最佳方法是什么?
例如,如果应用程序包含http调用,其中键可以是某些字符串,并且值是从http调用返回的响应,则由于网络问题或身份验证失败,http调用可能返回一些无效值(例如null)。
如果可能,我将更改此行为以在请求失败或响应无效时引发异常-这就是异常的用途。 有关更多信息,请参见有效的Java:项目57 。
然后可以使用缓存中的密钥将无效项另存为Optional.absent()。 稍后,如果解决了网络和身份验证问题,则key-> invalidValue仍保留在缓存中。 解决此问题的最佳方法是什么?
你有什么需要保存的无效结果在高速缓存中的原因是什么? 如果您不在意这种情况,而只是希望将其从缓存中排除,最简单的选择就是不首先缓存它。 在不良结果上抛出异常会很容易。
如果确实需要暂时将无效结果保留在缓存中,则可以在准备好简单的for循环后将其清除:
ConcurrentMap<K, V> cacheAsMap = cache.asMap();
for (Entry<K, V> e : cacheAsMap .entrySet()) {
if (!e.getValue().isPresent()) {
cacheAsMap.remove(e.getKey(), e.getValue());
}
}
通过使用ConcurrentMap.remove()
,可以避免可能的竞争情况,即在e.getValue().isPresent()
但实际上使该条目无效之前更新该条目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.