Cache-Räumung im Spring Boot

1. Übersicht

In diesem kurzen Tutorial erfahren Sie, wie Sie mit Spring eine Cache-Räumung durchführen können. Wir werden ein kleines Beispiel erstellen, um dies zu demonstrieren.

Bevor Sie fortfahren, lesen Sie unseren Artikel - Leitfaden zum Zwischenspeichern im Frühjahr -, um sich mit der Funktionsweise des Zwischenspeicherns im Frühjahr vertraut zu machen.

2. Wie lösche ich einen Cache?

Spring bietet zwei Möglichkeiten, einen Cache zu entfernen , entweder mithilfe der Annotation @CacheEvict für eine Methode oder indem der CacheManger automatisch verkabelt und durch Aufrufen der Methode clear () gelöscht wird.

Hier erfahren Sie, wie diese beiden Cache-Räumungsmechanismen im Code implementiert werden können.

2.1. Verwenden von @CacheEvict

Erstellen wir eine leere Methode mit der Annotation @CacheEvict und geben den Cache-Namen an, den wir als Argument für die Annotation löschen möchten (in diesem Fall möchten wir den Cache mit dem Namen "first" löschen):

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

Spring fängt alle mit @CacheEvict kommentierten Methoden ab und löscht alle Werte basierend auf dem allEntries- Flag . Es ist möglich, Werte basierend auf einem bestimmten Schlüssel zu entfernen.

Dazu müssen wir lediglich den Cache-Schlüssel als Argument an die Annotation übergeben, anstatt das allEntries- Flag:

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

Da der Wert des Schlüsselattributs dynamisch ist, können wir entweder Spring Expression Language oder einen benutzerdefinierten Schlüsselgenerator verwenden, indem wir KeyGenerator implementieren , um die interessierenden Argumente oder die verschachtelten Eigenschaften auszuwählen.

2.2. Verwenden von CacheManager

Als nächstes schauen wir uns an, wie wir den Cache mit dem vom Spring Cache-Modul bereitgestellten CacheManager entfernen können . Zuerst müssen wir die implementierte CacheManager- Bean automatisch verkabeln .

Und dann können wir die Caches damit löschen, basierend auf unseren Bedürfnissen:

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

Wie wir im Code sehen können, löscht die clear () -Methode alle Cache-Einträge und die evict () -Methode löscht Werte basierend auf einem Schlüssel .

3. Wie werden alle Caches entfernt?

Spring bietet keine sofort einsatzbereite Funktionalität zum Löschen aller Caches. Dies können wir jedoch leicht erreichen, indem wir die Methode getCacheNames () des Cache-Managers verwenden.

3.1. Räumung auf Abruf

Lassen Sie uns nun sehen, wie wir alle Caches bei Bedarf löschen können. Um einen Triggerpunkt zu erstellen, müssen wir zuerst einen Endpunkt verfügbar machen:

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

Im CachingService können wir dann alle Caches löschen , indem wir die vom Cache-Manager erhaltenen Cache-Namen durchlaufen :

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

3.2. Automatische Räumung

Es gibt bestimmte Anwendungsfälle, in denen die Cache-Räumung in bestimmten Intervallen automatisch durchgeführt werden sollte. In diesem Fall können wir den Taskplaner des Frühlings verwenden :

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

4. Fazit

Wir haben gelernt, wie man Caches auf verschiedene Arten entfernt. Eines der erwähnenswerten Dinge an diesen Mechanismen ist, dass es mit all den verschiedenen Cache-Implementierungen wie eh-cache, infini-span, apache-ignite usw. funktioniert.

Wie immer finden Sie alle in diesem Tutorial genannten Beispiele auf Github.