«1. Обзор

В этом коротком руководстве мы узнаем, как выполнить вытеснение кэша с помощью Spring. Мы создадим небольшой пример, чтобы продемонстрировать это.

Прежде чем продолжить, ознакомьтесь с нашей статьей «Руководство по кэшированию в Spring», чтобы ознакомиться с тем, как работает кэширование Spring.

2. Как удалить кэш?

Spring предоставляет два способа удаления кеша: либо с помощью аннотации @CacheEvict к методу, либо путем автоматического подключения CacheManger и его очистки с помощью вызова метода clear().

Вот как эти два механизма вытеснения кэша могут быть реализованы в коде.

2.1. Использование @CacheEvict

Давайте создадим пустой метод с аннотацией @CacheEvict и укажем имя кеша, которое мы хотим очистить, в качестве аргумента аннотации (в данном случае мы хотим очистить кеш с именем «first»). :

@CacheEvict(value = "first", allEntries = true)
public void evictAllCacheValues() {}

Spring перехватит все методы, аннотированные @CacheEvict, и очистит все значения на основе флага allEntries. Можно исключить значения на основе определенного ключа.

Для этого все, что нам нужно сделать, это передать ключ кеша в качестве аргумента аннотации вместо флага allEntries:

@CacheEvict(value = "first", key = "#cacheKey")
public void evictSingleCacheValue(String cacheKey) {}

Поскольку значение атрибута ключа является динамическим, мы можем либо использовать Spring Язык выражений или пользовательский генератор ключей путем реализации KeyGenerator для выбора интересующих аргументов или вложенных свойств.

2.2. Использование CacheManager

Далее давайте посмотрим, как мы можем удалить кэш с помощью CacheManager, предоставляемого модулем Spring Cache. Во-первых, мы должны автоматически связать реализованный компонент CacheManager.

И затем мы можем очистить кеш с его помощью в зависимости от наших потребностей:

@Autowired
CacheManager cacheManager;

public void evictSingleCacheValue(String cacheName, String cacheKey) {
    cacheManager.getCache(cacheName).evict(cacheKey);
}

public void evictAllCacheValues(String cacheName) {
    cacheManager.getCache(cacheName).clear();
}

Как мы видим в коде, метод clear() очистит все записи кеша, а метод evict() очистит значения на основе ключа.

3. Как удалить все кэши?

Spring не предоставляет готовых функций для очистки всех кешей. Но мы можем легко добиться этого, используя метод getCacheNames() менеджера кеша.

3.1. Выселение по требованию

Давайте теперь посмотрим, как мы можем очистить все кеши по требованию. Чтобы создать точку срабатывания, мы должны сначала предоставить конечную точку:

@RestController
public class CachingController {
	
    @Autowired
    CachingService cachingService;
	
    @GetMapping("clearAllCaches")
    public void clearAllCaches() {
        cachingService.evictAllCaches();
    }
}

В CachingService мы можем затем очистить все кэши, перебирая имена кэшей, полученные от диспетчера кэшей:

public void evictAllCaches() {
    cacheManager.getCacheNames().stream()
      .forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}

~~ ~ 3.2. Автоматическое вытеснение

В некоторых случаях вытеснение кеша должно выполняться автоматически через определенные промежутки времени. В этом случае мы можем использовать планировщик задач Spring:

@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
    evictAllCaches();
}

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

Мы научились вытеснять кеши разными способами. Стоит отметить, что эти механизмы будут работать со всеми различными реализациями кэша, такими как eh-cache, infini-span, apache-ignite и т. д.

Как всегда, все примеры, упомянутые в этом руководстве, могут быть найдено на Github.