1

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

4

1 回答 1

0

例如,如果应用程序包含 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()调用之后但在条目实际无效之前更新条目。

于 2017-12-06T08:53:28.660 回答