Введение в Guava CacheLoader

Введение в Guava CacheLoader

1. Вступление

В этой статье мы познакомим вас с GuavaCacheLoader.

Прежде чем читать дальше, рекомендуется сначала получить базовое представление о классеLoadingCache. Это потому, чтоCacheLoader работает именно с ним.

По сути,CacheLoader - это функция, используемая для вычисления значения в случае, если оно не найдено в GuavaLoadingCache.

2. ИспользуяCacheLoader сLoadingCache

Когда происходит промах кеша сLoadingCache, или кеш необходимо обновить,CacheLoader будет использоваться для вычисления значений. Это помогает инкапсулировать нашу логику кэширования в одном месте, делая наш код более связным.

2.1. Maven Dependency

Во-первых, давайте добавим нашу зависимость Maven:


  com.google.guava
  guava
  21.0

Вы можете найти последнюю версию в папкеMaven repository.

2.2. Вычисление и кэширование значений

Теперь давайте посмотрим, как мы можем создать экземплярLoadingCache с помощьюCacheLoader:

LoadingCache loadingCache = CacheBuilder.newBuilder()
  .build(new CacheLoader() {
    @Override
    public String load(final String s) throws Exception {
      return slowMethod(s);
    }
});

По сути,LoadingCache будет вызывать наш встроенныйCacheLoader всякий раз, когда ему нужно вычислить значение, которое не было кэшировано. Давайте попробуем посчитать, сколько раз вызывается нашslowMethod(), когда мы получаем что-то из кеша несколько раз:

String value = loadingCache.get("key");
value = loadingCache.get("key");

assertThat(callCount).isEqualTo(1);
assertThat(value).isEqualTo("expectedValue");

Как мы видим, он был вызван только один раз. В первый раз значение не было кэшировано, так как оно еще не было вычислено. Во второй раз он был кэширован из предыдущего вызова, поэтому мы могли избежать накладных расходов на повторный вызов нашегоslowMethod().

2.3. Обновление кеша

Другая распространенная проблема с кэшированием - это обновление кэша. Хотя самым сложным аспектом является знаниеwhen для обновления кеша, другим является знаниеhow.

Решитьhow просто при использованииCacheLoader..LoadingCache просто вызовет его для каждого значения, которое необходимо обновить. Давайте попробуем это с помощью теста:

String value = loadingCache.get("key");
loadingCache.refresh("key");

assertThat(callCount).isEqualTo(2);
assertThat(value).isEqualTo("key");

В отличие от наших последующих вызововget(), refresh() заставит снова вызватьCacheLoader, чтобы убедиться, что наши значения актуальны.

3. Заключение

В этой статье мы объяснили, какLoadingCache используетсяCacheLoader для вычисления значений промахов кеша, а также обновлений кеша. Также стоит прочитать эту более подробную статью оGuava Caching.

Реализацию этих примеров можно найти вover on GitHub. Это проект Maven, поэтому его легко запустить как есть.