Перейти к основному содержимому

Введение в Guava CacheLoader

· 2 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

1. Введение

В этой статье мы познакомимся с Guava CacheLoader .

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

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

2. Использование CacheLoader с LoadingCache

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

2.1. Зависимость от Maven

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

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

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

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

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

LoadingCache<String, String> loadingCache = CacheBuilder.newBuilder()
.build(new CacheLoader<String, String>() {
@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. Обновление кеша

Еще одна распространенная проблема с кэшированием — обновление кеша. Хотя самым сложным аспектом является знание того, когда обновлять кеш, еще одним является знание того, как это сделать.

Решить как просто при использовании 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 .

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