首页 > 解决方案 > 咖啡因缓存,仅在放置成功时才执行过期元素的驱逐

问题描述

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

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

如果数据库访问失败,即使缓存中的数据过期,我也想回退到缓存。此用例假设过期数据尚未删除。

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

标签: caffeinecaffeine-cache

解决方案


这可以通过使用受害者缓存来捕获最近过期的条目并在数据库关闭时从负载中恢复来实现。受害者缓存需要自己的边界,例如更长的过期阈值。

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);
       }
     });

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


推荐阅读