Кофеин кеш, выселение элемента с истекшим сроком только тогда, когда положено - PullRequest
0 голосов
/ 23 апреля 2020

Я использую кеш Caffeine для кэширования данных, поступающих из БД, которые необходимо обслуживать в конечную точку отдыха. Таким образом, кэш обновляется ТОЛЬКО при операциях чтения в БД.

В номинальном случае я хочу, чтобы кэш брал на себя инициативу ответа до тех пор, пока данные не станут старше, чем в некоторый момент времени (=> этот случай все в порядке, определяя правильные параметры истечения срока действия)

В случае сбоя доступа к БД, я хочу вернуться к кешу, даже если истек срок действия данных в кеше. В этом сценарии использования предполагается, что данные с истекшим сроком действия еще не удалены.

Решение, о котором я думаю, - сделать Eviction of Items from the cache only after a successful PUT (успешное PUT означает, что БД работает правильно). Это возможно сделать?

1 Ответ

1 голос
/ 23 апреля 2020

Этого можно достичь, используя кэш-память жертвы для захвата недавно истекших записей и воскрешения из него при загрузке, если БД не работает. Кэш-память жертвы должна иметь свою собственную границу, например, более длинный порог истечения срока действия.

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

Это позволило бы при сбое загрузки воскресить запись из кэша жертвы, если запись присутствует.

...