Цель аргумента функции построения кофеина - PullRequest
0 голосов
/ 08 сентября 2018

плохо знакомы с кофеином и я явно упускаю что-то сверхосновное. Все основные примеры использования, которые я вижу, выглядят так:

LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.DAYS)
    .build(k -> fetchFizzbuzzes());

То, с чем я борюсь, это роль, которую играет функция fetchFizzbuzzes():

  • Используется ли он для заполнения начального кэша?
  • Используется ли это как какой-то запасной вариант, если в кеше не существует ключа?
  • Что-то еще?

1 Ответ

0 голосов
/ 08 сентября 2018

На самом деле это самая важная часть строителя. Функция, переданная методу build(CacheLoader), берет ключ и вычисляет значение для этого ключа. Эта функция вызывается, если в данный момент в кеше нет значения этого ключа. Вычисленное значение будет добавлено в кеш позже. Существует также метод build() без аргументов, который можно использовать, если вы хотите вручную проверить наличие элементов в кэше и добавить их вручную.

Однако ваш пример не имеет особого смысла, так как метод fetchFizzbuzzes() не имеет аргументов. То есть - без побочных эффектов - он, вероятно, вернет одинаковое значение для всех клавиш k.

Возьмите примеры ниже:

LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.DAYS)
    .build(key -> fetchFizzbuzzes(key));
fizzbuzzes.get("myKey"); // will automatically invoke fetchFizzbuzzes with 'myKey' as argument
fizzbuzzes.get("myKey"); // fetchFizzbuzzes won't be called as return value from previous call is added to the cache automatically


Cache<String, Fizzbuzz> fizzbuzzesManual = Caffeine.newBuilder()
     .maximumSize(100)
     .expireAfterWrite(10, TimeUnit.DAYS)
     .build();
fizzbuzzesManual.getIfPresent("myKey"); // will return null as no element for 'myKey' was added to the cache before

См. Кофеин вики для получения дополнительной информации.

...