Expulsion du cache dans Spring Boot

1. Vue d'ensemble

Dans ce court didacticiel, nous allons apprendre comment effectuer l'expulsion du cache à l'aide de Spring. Nous allons créer un petit exemple pour le démontrer.

Avant de continuer, consultez notre article - Guide de la mise en cache au printemps - pour vous familiariser avec le fonctionnement de la mise en cache de Spring.

2. Comment expulser un cache?

Spring propose deux méthodes pour expulser un cache, soit en utilisant l' annotation @CacheEvict sur une méthode, soit en câblant automatiquement CacheManger et en l'effaçant en appelant la méthode clear () .

Voici comment ces deux mécanismes d'éviction de cache peuvent être implémentés dans le code.

2.1. Utiliser @CacheEvict

Créons une méthode vide avec l' annotation @CacheEvict et fournissons le nom du cache que nous voulons effacer comme argument de l'annotation (dans ce cas, nous voulons effacer le cache avec le nom «first»):

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

Spring interceptera toutes les méthodes annotées avec @CacheEvict et effacera toutes les valeurs basées sur l' indicateur allEntries . Il est possible d'expulser des valeurs basées sur une clé particulière.

Pour cela, tout ce que nous avons à faire est de passer la clé de cache comme argument à l'annotation au lieu de l' indicateur allEntries :

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

Étant donné que la valeur de l' attribut de clé est dynamique, nous pouvons utiliser Spring Expression Language ou un générateur de clé personnalisé en implémentant KeyGenerator pour sélectionner les arguments d'intérêt ou les propriétés imbriquées.

2.2. Utilisation de CacheManager

Ensuite, voyons comment nous pouvons expulser le cache à l'aide du CacheManager fourni par le module Spring Cache. Tout d'abord, nous devons câbler automatiquement le bean CacheManager implémenté .

Et puis nous pouvons effacer les caches avec lui en fonction de nos besoins:

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

Comme nous pouvons le voir dans le code, la méthode clear () effacera toutes les entrées du cache et la méthode evict () effacera les valeurs en fonction d'une clé .

3. Comment expulser tous les caches?

Spring ne fournit pas de fonctionnalité prête à l'emploi pour effacer tous les caches. Mais nous pouvons y parvenir facilement en utilisant la méthode getCacheNames () du gestionnaire de cache.

3.1. Expulsion à la demande

Voyons maintenant comment nous pouvons effacer tous les caches à la demande. Afin de créer un point de déclenchement, nous devons d'abord exposer un point de terminaison:

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

Dans le CachingService , nous pouvons ensuite effacer tous les caches en itérant sur les noms de cache obtenus à partir du gestionnaire de cache :

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

3.2. Expulsion automatique

Il existe certains cas d'utilisation dans lesquels l'expulsion du cache doit être effectuée automatiquement à certains intervalles. Dans ce cas, nous pouvons utiliser le planificateur de tâches de Spring :

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

4. Conclusion

Nous avons appris à expulser les caches de différentes manières. Une des choses à noter à propos de ces mécanismes est qu'il fonctionnera avec toutes les différentes implémentations de cache comme eh-cache, infini-span, apache-ignite, etc.

Comme toujours, tous les exemples mentionnés dans ce tutoriel peuvent être trouvés sur Github.