#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)
, а не явного ввода. Это помогает избежать давки в кэше, когда несколько потоков выполняют избыточную работу при пропуске, чтобы заполнить одну и ту же запись в кэше.