我使用Caffeine缓存来缓存来自DB的数据,这些数据需要提供给rest端点。因此,缓存仅在数据库上的读取操作时更新。
在名义上的情况下,我希望缓存率先响应,直到数据不超过某个时间点( =>这种情况下可以通过定义正确的过期选项)
在数据库访问失败的情况下,即使缓存中的数据已过期,我也希望回退到缓存。此用例假设尚未删除过期数据。
我正在考虑的解决方案是创建Eviction of Items from the cache only after a successful PUT (成功的PUT意味着数据库工作正常)。这有可能做到吗?
发布于 2020-04-23 23:45:34
这可以通过使用牺牲性高速缓存来捕获最近过期的条目并在db停机时在加载时从其重新启动来实现。牺牲性高速缓存将需要它自己的边界,例如更长的到期阈值。
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);
}
});这将允许加载失败从牺牲性高速缓存中复活该条目(如果该条目存在)。
https://stackoverflow.com/questions/61389759
复制相似问题