gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:55:09 27 4
gpt4 key购买 nike

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

最佳答案

For example, if an application contains http calls where the key can be some string and the value is response returned from the http call, the http call can return some invalid values (for example null) because of network issues or authentication failures

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

then the invalid can be saved as Optional.absent() with the key in cache. At a later point, if the network and authentication problems are fixed, the key->invalidValue still remains in the cache. What is the best to fix this problem?

您是否有需要将无效结果保存在缓存中?如果您不关心缺席的情况,只是希望将其从缓存中排除,最简单的选择是首先不缓存它。在不好的结果上抛出异常会让这件事变得容易。

如果您确实需要暂时将无效结果保留在缓存中,则可以在准备好使用简单的 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() 之后但在条目实际失效之前更新条目。

关于java - Google Guava 缓存自动删除Optional.absent()的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com