«1. Обзор

Caffeine cache — это высокопроизводительная библиотека кэширования для Java. В этом кратком руководстве мы увидим, как использовать его с Spring Boot.

2. Зависимости

Чтобы начать работу с Caffeine и Spring Boot, мы сначала добавим зависимости spring-boot-starter-cache и caffeine:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
    </dependency>
</dependencies>

Они импортируют базовую поддержку кэширования Spring вместе с Кофеиновая библиотека.

3. Конфигурация

Теперь нам нужно настроить кэширование в нашем приложении Spring Boot.

Во-первых, мы создаем Caffeine bean. Это основная конфигурация, которая будет управлять поведением кэширования, таким как истечение срока действия, ограничения размера кэша и т. д.:

@Bean
public Caffeine caffeineConfig() {
    return Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.MINUTES);
}

Далее нам нужно создать еще один bean-компонент, используя интерфейс Spring CacheManager. Caffeine предоставляет свою реализацию этого интерфейса, для которого требуется объект Caffeine, который мы создали выше:

@Bean
public CacheManager cacheManager(Caffeine caffeine) {
    CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
    caffeineCacheManager.setCaffeine(caffeine);
    return caffeineCacheManager;
}

Наконец, нам нужно включить кэширование в Spring Boot с помощью аннотации @EnableCaching. Это можно добавить в любой класс @Configuration в приложении.

4. Примеры

Если кэширование включено и настроено на использование Caffeine, давайте рассмотрим несколько примеров того, как мы можем использовать кэширование в нашем приложении Spring Boot.

Основной способ использования кэширования в Spring Boot — это аннотация @Cacheable. Эта аннотация работает с любым методом компонента Spring (или даже со всем классом). Он указывает зарегистрированному диспетчеру кеша сохранить результат вызова метода в кеше.

Типичное использование внутри классов обслуживания:

@Service
public class AddressService {
    @Cacheable
    public AddressDTO getAddress(long customerId) {
        // lookup and return result
    }
}

Использование аннотации @Cacheable без параметров заставит Spring использовать имена по умолчанию как для кеша, так и для ключа кеша.

Мы можем переопределить оба эти поведения, добавив некоторые параметры в аннотацию:

@Service
public class AddressService {
    @Cacheable(value = "address_cache", key = "customerId")
    public AddressDTO getAddress(long customerId) {
        // lookup and return result
    }
}

Пример выше указывает Spring использовать кеш с именем address_cache и аргументом customerId для ключа кеша.

Наконец, поскольку менеджер кеша сам по себе является компонентом Spring, мы также можем автоматически связать его с любым другим компонентом и работать с ним напрямую:

@Service
public class AddressService {

    @Autowired
    CacheManager cacheManager;

    public AddressDTO getAddress(long customerId) {
        if(cacheManager.containsKey(customerId)) {
            return cacheManager.get(customerId);
        }
        
        // lookup address, cache result, and return it
    }
}

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

В этом руководстве мы видели как настроить Spring Boot для использования кэша Caffeine, а также несколько примеров использования кэширования в нашем приложении.

И, конечно же, все примеры кода находятся на GitHub.