Caffeine 缓存,只有在 put 成功时才执行过期元素的驱逐

Caffeine cache, perform eviction of expired element only when put succeds

我使用 Caffeine 缓存来缓存来自需要提供给休息端点的数据库的数据。 因此缓存仅在对数据库进行读取操作时更新。

在标称情况下,我希望缓存带头响应,直到数据不早于某个时间点(=> 这种情况可以通过定义正确的过期选项来解决)

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

我想到的解决方案是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);
       }
     });

如果条目存在,这将允许加载失败从受害者缓存中恢复条目。