Я пытаюсь использовать кофеин кеш и у меня проблема:
Допустим, кеш пуст, и я запрашиваю значение, он использует загрузчик и загружает новое значение в кеш, через 2 дня Я передаю запрос на то же значение, и сначала получаю значение OLD , затем refre sh запускается в отдельном потоке, и новое значение загружается, если загрузка возможна.
Caffeine.newBuilder()
.refreshAfterWrite(5, TimeUnit.MINUTES)
.expireAfterWrite(3, TimeUnit.DAYS)
.build(loader);
То, что я хочу заархивировать, - сначала попытаться обновить sh и, если возможно, сначала вернуть новое значение, если что-то пойдет не так, только потом вернуть старое. Как я могу заархивировать это? Как реализовать простую, перспективную, аккуратную реализацию без обходных путей? Это было бы здорово!
Редактировать: Будет ли это решение работать правильно?
boolean needsSyncRefresh = cache.policy().expireAfterWrite()
.flatMap(stringBigDecimalExpiration -> stringBigDecimalExpiration.ageOf(key))
.filter(age -> age.toMinutes() < 0 || age.toMinutes() > REFRESH_AFTER_MINUTES)
.isPresent();
V value = cache.get(key);
if (needsSyncRefresh) {
return cache.asMap().computeIfPresent(key, (k, oldValue) -> {
if (oldValue.equals(value)) {
try {
return loader(key);
} catch (Exception e) {
//handle error
}
}
return oldValue;
});
}
return value;