Sfratto della cache in Spring Boot

1. Panoramica

In questo breve tutorial, impareremo come eseguire l'eliminazione della cache utilizzando Spring. Creeremo un piccolo esempio per dimostrarlo.

Prima di procedere, consulta il nostro articolo - Guida al caching in Spring - per familiarizzare con il funzionamento del caching di Spring.

2. Come sfrattare una cache?

Spring fornisce due modi per rimuovere una cache, utilizzando l' annotazione @CacheEvict su un metodo o cablando automaticamente CacheManger e cancellandolo chiamando il metodo clear () .

Ecco come questi due meccanismi di eliminazione della cache possono essere implementati nel codice.

2.1. Utilizzando @CacheEvict

Creiamo un metodo vuoto con l' annotazione @CacheEvict e forniamo il nome della cache che vogliamo cancellare come argomento dell'annotazione (in questo caso, vogliamo cancellare la cache con il nome "first"):

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

Spring intercetterà tutti i metodi annotati con @CacheEvict e cancellerà tutti i valori basati sul flag allEntries . È possibile rimuovere i valori in base a una chiave particolare.

Per questo, tutto ciò che dobbiamo fare è passare la chiave della cache come argomento per l'annotazione invece del flag allEntries :

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

Poiché il valore dell'attributo chiave è dinamico, possiamo utilizzare Spring Expression Language o un generatore di chiavi personalizzato implementando KeyGenerator per selezionare gli argomenti di interesse o le proprietà annidate.

2.2. Utilizzando CacheManager

Successivamente, diamo un'occhiata a come possiamo rimuovere la cache utilizzando il CacheManager fornito dal modulo Spring Cache. Innanzitutto, dobbiamo collegare automaticamente il bean CacheManager implementato .

E poi possiamo cancellare le cache con esso in base alle nostre esigenze:

@Autowired CacheManager cacheManager; public void evictSingleCacheValue(String cacheName, String cacheKey) { cacheManager.getCache(cacheName).evict(cacheKey); } public void evictAllCacheValues(String cacheName) { cacheManager.getCache(cacheName).clear(); }

Come possiamo vedere nel codice, il metodo clear () cancellerà tutte le voci della cache e il metodo evict () cancellerà i valori in base a una chiave .

3. Come eliminare tutte le cache?

Spring non fornisce una funzionalità pronta all'uso per cancellare tutte le cache. Ma possiamo ottenere questo facilmente utilizzando il metodo getCacheNames () del gestore della cache.

3.1. Sfratto a richiesta

Vediamo ora come possiamo cancellare tutte le cache su richiesta. Per creare un punto trigger, dobbiamo prima esporre un endpoint:

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

Nel CachingService , possiamo quindi cancellare tutte le cache iterando sui nomi della cache ottenuti dal gestore della cache :

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

3.2. Sfratto automatico

Esistono alcuni casi d'uso in cui l'eliminazione della cache deve essere eseguita automaticamente a determinati intervalli. In questo caso, possiamo utilizzare il task scheduler di Spring :

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

4. Conclusione

Abbiamo imparato come eliminare le cache in diversi modi. Una delle cose che vale la pena notare di questi meccanismi è che funzionerà con tutte le varie implementazioni della cache come eh-cache, infini-span, apache-ignite ecc.

Come sempre, tutti gli esempi menzionati in questo tutorial possono essere trovati su Github.