Google Guava кеш автоматически удаляет значение Optional.absent()

Можно ли автоматически выселить запись со значением Optional.absent()? В некоторых приложениях Optional.absent () может не быть значением для некоторых ключей. Например, если приложение содержит вызовы http, где ключом может быть какая-то строка, а значением является ответ, возвращаемый при вызове http, вызов http может вернуть некоторые недопустимые значения (например, null) из-за проблем с сетью или сбоев аутентификации, тогда Неверный может быть сохранен как Optional.absent () с ключом в кеше. Позже, если проблемы с сетью и аутентификацией устранены, ключ->invalidValue все еще остается в кэше. Что лучше всего решить эту проблему?

1 ответ

Например, если приложение содержит вызовы http, где ключом может быть некоторая строка, а значением является ответ, возвращаемый при вызове http, вызов http может вернуть некоторые недопустимые значения (например, null) из-за проблем с сетью или сбоев аутентификации.

Если возможно, я бы изменил это поведение, чтобы выбрасывать исключение, когда запрос не выполняется или ответ недействителен - вот для чего нужны исключения. См. Эффективная Java: пункт 57 для более подробной информации.

тогда недействительный может быть сохранен как Optional.absent() с ключом в кеше. Позже, если проблемы с сетью и аутентификацией устранены, ключ->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() вызывается, но до того, как запись фактически станет недействительной.

Другие вопросы по тегам