我正在尝试使用咖啡因缓存并遇到问题:
比方说,缓存为空,我查询一个值,它使用加载程序并将新值加载到缓存中,经过2天后,我查询相同的值,并得到 OLD 值首先,然后在单独的线程上启动刷新,并在可能的情况下加载新值。
caffeine.newBuilder()
.refreshAfterWrite(5,TimeUnit.MINUTES)
.expireAfterWrite(3,TimeUnit.DAYS)
.build(loader);
我要存档的是-尝试先刷新并在可能的情况下先返回新值,如果出了问题,则仅返回旧值。我该如何存档?如何实现简单,面向未来的整洁实施,而又没有变通办法?太棒了!
编辑:此解决方案能否正常工作?
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;