Рубрики
Без рубрики

Удаление кэша при весенней загрузке

Узнайте, как аннулировать кэши с помощью Spring Boot.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@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() очистит все записи кэша, а метод exelt() очистит значения на основе ключа .

3. Как удалить все тайники?

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

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

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

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

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

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 .