我使用Caffeine缓存来缓存来自需要服务到其余端点的数据库的数据。 因此,仅在对数据库进行读取操作时才更新缓存。
在正常情况下,我希望缓存带头进行响应,直到数据不早于某个时间点为止(=>在这种情况下,可以通过定义正确的到期时间选项来解决问题)
在数据库访问失败的情况下,即使缓存中的数据已过期,我也要回退到缓存。 此用例假定尚未删除过期数据。
我正在考虑的解决方案是制作Eviction of Items from the cache only after a successful PUT
(成功的PUT表示DB正常工作)。
那有可能吗?
答案 0 :(得分:2)
这可以通过使用受害者高速缓存来捕获最近过期的条目并在数据库关闭时从负载中恢复来完成。受害者缓存将需要其自身的边界,例如更长的到期阈值。
Cache<K, V> victimCache = Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTE)
.build();
LoadingCache<K, V> mainCache = Caffeine.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTE)
.writer(new CacheWriter<K, V>() {
public void write(K key, V value) { /* ignored */ }
public void delete(K key, V value, RemovalCause cause) {
if (cause == RemovalCause.EXPIRED) {
victimCache.put(key, value);
}
})
.build(key -> {
try {
// load from db
} catch (DatabaseAccessException e) {
return victimCache.asMap().remove(key);
}
});
如果存在条目,这将允许加载失败以从受害者缓存中恢复该条目。