Пример использования кофеина для каждого ключа с истекшим сроком годности

#java #caffeine #caffeine-cache

#java #кофеин #кофеин-кэш

Вопрос:

Есть ли какие-либо примеры того, как использовать по истечении срока действия ключа в Caffeine?

Я вижу следующий пример — означает ли это, что мы создаем экземпляр кэша кофеина для каждого ключа?

https://github.com/ben-manes/caffeine/issues/114#issuecomment-300602200

 Caffeine.newBuilder()
.expireAfter(new Expiry<Key, Graph>() {
  public long expireAfterCreate(Key key, Graph graph, long currentTime) {
    return (graph instanceof NullGraph)
        ? TimeUnit.MINUTES.toNanos(1)
        : TimeUnit.MINUTES.toNanos(10);
  }
  public long expireAfterUpdate(Key key, Graph graph, 
      long currentTime, long currentDuration) {
    return currentDuration;
  }
  public long expireAfterRead(Key key, Graph graph,
      long currentTime, long currentDuration) {
    return currentDuration;
  }
})
.build(key -> createExpensiveGraph(key));
  

Я посмотрел на реализацию и увидел, как реализация интерфейса истечения срока годности используется внутри.

Итак, скажем, у моего объекта graph был метод для продолжительности истечения срока действия.. будет ли это правильным использованием?

 final Cache<Key, Graph> cache = Caffeine.newBuilder()
.expireAfter(new Expiry<Key, Graph>() {
  public long expireAfterCreate(Key key, Graph graph, long currentTime) {
    return currentTime   graph.expireAfterNanos();
  }
  public long expireAfterUpdate(Key key, Graph graph, 
      long currentTime, long currentDuration) {
    return Long.Max;
  }
  public long expireAfterRead(Key key, Graph graph,
      long currentTime, long currentDuration) {
    return Long.Max;
  }
})
.build();
  

Теперь каждый раз, когда я делаю что-то вроде следующего — для каждого введенного ключа будет активирован срок действия —

 cache.put(key, graph); // key and graph creation not shown here.
  

Комментарии:

1. Это означает, что для данного ключа время его истечения в кэше варьируется. С момента его создания в кэш может быть добавлено либо 1, либо 10 минут, и чтение / обновление не изменяют эту продолжительность. Длительность настраивается для каждой записи и основана на атрибуте значения (нулевой график — например, отрицательное кэширование). Все записи хранятся в одном экземпляре кэша (хэш-карте).

2. посмотрел на реализацию и опубликовал обновление моего вопроса. Мне еще предстоит его протестировать, но вот как его использовать? Кстати, спасибо за быстрый ответ!

3. Почти. Возвращаемое значение — это новая продолжительность, поэтому срок ее действия истекает в currentTime duration . Вы можете удалить currentTime часть, поскольку это неверно. Тогда МАКСИМАЛЬНОЕ значение делает запись неподходящей для истечения срока действия после чтения или обновления, что, вероятно, также не является вашим намерением. Вот почему исходный образец не изменяет его, возвращая currentDuration .

4. Обратите внимание, что Expiry это конфигурация в стиле обратного вызова, потому что мы настоятельно предпочитаем загрузку через кэш с помощью get(key, mappingFunction) , а не явного ввода. Это помогает избежать давки в кэше, когда несколько потоков выполняют избыточную работу при пропуске, чтобы заполнить одну и ту же запись в кэше.