caffeine - 咖啡因缓存,仅在放置成功时才执行过期元素的驱逐
问题描述
我使用 Caffeine 缓存来缓存来自需要提供给休息端点的数据库的数据。因此缓存仅在数据库上的读取操作时更新。
在名义情况下,我希望缓存带头响应,直到数据不超过某个时间点(=>这种情况通过定义正确的过期选项就可以了)
如果数据库访问失败,即使缓存中的数据过期,我也想回退到缓存。此用例假设过期数据尚未删除。
我正在考虑的解决方案是制作Eviction of Items from the cache only after a successful PUT
(成功的 PUT 意味着数据库工作正常)。那有可能吗?
解决方案
这可以通过使用受害者缓存来捕获最近过期的条目并在数据库关闭时从负载中恢复来实现。受害者缓存需要自己的边界,例如更长的过期阈值。
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);
}
});
如果条目存在,这将允许加载失败从受害者缓存中恢复条目。
推荐阅读
- opengl - 检查着色器存储块是否为只读
- html - 如何将图像放在顶部但仍然响应?
- android - 如何使用 kotlin 在 android studio 中的片段之间滑动?
- python - 将字符串中的所有冗余浮点数转换为整数
- javascript - 从 Google Vision API 获取时出现 TypeError
- typescript - Typescript tsconfig 设置输出一个文件?
- r - 如何让我的 train() 函数在闪亮状态下运行以评估模型性能?
- tensorflow - 这个 Dense 层是如何计算它的维度的?
- asp.net-core-mvc - MVC Net Core Identity 用户不使用 EF 而不是 SQL
- laravel - 检查模型是否属于其他模型