Изтласкване на кеша в пролетно зареждане

1. Общ преглед

В този кратък урок ще научим как можем да извършим изваждане на кеша с помощта на Spring. Ще създадем малък пример, който да демонстрира това.

Преди да продължите, разгледайте нашата статия - Ръководство за кеширане през пролетта, за да се запознаете с това как работи кеширането на пролетта.

2. Как да извадя кеш паметта?

Spring осигурява два начина за изваждане на кеш памет, или чрез използване на анотацията @CacheEvict за метод, или чрез автоматично свързване на CacheManger и изчистването му чрез извикване на метода clear () .

Ето как тези два механизма за изваждане на кеша могат да бъдат внедрени в код.

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

Нека създадем празен метод с @CacheEvict анотация и предоставим името на кеша, което искаме да изчистим като аргумент на анотацията (в този случай искаме да изчистим кеша с името „първо“):

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

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

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

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

Тъй като стойността на атрибута ключ е динамична, можем да използваме Spring Expression Language или персонализиран генератор на ключове чрез внедряване на 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(); }

Както можем да видим в кода, на ясна () метод, ще изчисти всички записи за кеш и изгони () метод, ще изчисти стойности, основаващи се на ключово .

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.