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 .