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

时间:2016-02-17 21:22:52

标签: java google-guava-cache

是否可以使用值Optional.absent()自动逐出记录?在某些应用程序中,Optional.absent()可能不是某些键的值。例如,如果应用程序包含http调用,其中键可以是某个字符串,并且值是从http调用返回的响应,则http调用可能会因网络问题或身份验证失败而返回一些无效值(例如null),然后invalid可以保存为Optional.absent(),密钥在缓存中。稍后,如果网络和身份验证问题得到解决,则key-> invalidValue仍会保留在缓存中。解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

  

例如,如果应用程序包含http调用,其中键可以是某个字符串,并且值是从http调用返回的响应,则http调用可能会因网络问题或身份验证失败而返回一些无效值(例如null)

如果可能的话,我会更改此行为,以便在请求失败或响应无效时抛出异常 - 这就是异常的用途。有关更多信息,请参阅 Effective Java:Item 57

  

然后可以使用缓存中的密钥将invalid保存为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()之后但在条目实际无效之前更新条目。