繁体   English   中英

Google Guava缓存会自动删除Optional.absent()的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM