首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caffeine缓存,只在put成功时执行过期元素的逐出

Caffeine缓存,只在put成功时执行过期元素的逐出
EN

Stack Overflow用户
提问于 2020-04-23 22:33:11
回答 1查看 600关注 0票数 0

我使用Caffeine缓存来缓存来自DB的数据,这些数据需要提供给rest端点。因此,缓存仅在数据库上的读取操作时更新。

在名义上的情况下,我希望缓存率先响应,直到数据不超过某个时间点( =>这种情况下可以通过定义正确的过期选项)

在数据库访问失败的情况下,即使缓存中的数据已过期,我也希望回退到缓存。此用例假设尚未删除过期数据。

我正在考虑的解决方案是创建Eviction of Items from the cache only after a successful PUT (成功的PUT意味着数据库工作正常)。这有可能做到吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 23:45:34

这可以通过使用牺牲性高速缓存来捕获最近过期的条目并在db停机时在加载时从其重新启动来实现。牺牲性高速缓存将需要它自己的边界,例如更长的到期阈值。

代码语言:javascript
复制
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);
       }
     });

这将允许加载失败从牺牲性高速缓存中复活该条目(如果该条目存在)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61389759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档