1. Was ist Cache -Cache
Das Wort Cache stammte zum ersten Mal von CPU -Design
Wenn die CPU eine Daten lesen möchte, schaut sie zuerst aus dem CPU -Cache auf und liest sie sofort und sendet sie zur Verarbeitung an die CPU, wenn sie gefunden wird. Wenn es nicht gefunden wird, wird es aus dem relativ langsamen Speicher gelesen und zur Verarbeitung an die CPU gesendet. Gleichzeitig wird der Datenblock, in dem sich diese Daten befinden, in den Cache gerufen, so dass der gesamte Datenblock in Zukunft aus dem Cache gelesen werden kann, ohne Speicher aufzurufen. Es ist dieser Lesemechanismus, der die CPU -Lese -Cache -Trefferrate sehr hoch macht (die meisten CPUs können etwa 90% erreichen), was bedeutet, dass 90% der Daten, die die CPU beim nächsten Mal lesen wird, im CPU -Cache liegt und nur etwa 10% aus dem Speicher gelesen werden müssen. Dies spart der CPU -Zeit erheblich, um den Speicher direkt zu lesen, und macht es der CPU auch unmöglich, Daten zu lesen, ohne zu warten. Im Allgemeinen wird die Reihenfolge, in der die CPU Daten liest, zuerst zwischengespeichert und dann Speicher.
Später gingen wir zuerst zum Festplatten -Cache, dann zum Anwendungscache, zum Browser -Cache, zum Webcache usw.!
Cache ist König! !
Frühlingscache
Spring Cache ist ein vollständiger Satz von Anwendungs -Caching -Lösungen, die von Federanwendungen angegeben sind.
Spring Cache selbst bietet keine Cache -Implementierung, sondern verwendet einheitliche Schnittstellen und Codespezifikationen, Konfigurationen, Anmerkungen usw., damit Sie verschiedene Caches in Frühlingsanwendungen verwenden können, ohne den Details des Cache zu viel Aufmerksamkeit schenken zu müssen. Mit Frühlingscache können Sie es einfach verwenden
Verschiedene Cache -Implementierungen, einschließlich ConcurrentMap, EHCache 2.x, JCache, Redis usw.
Die Definition von Cache im Frühjahr
Die Definition von Cache im Frühjahr, einschließlich der Schnittstelle org.springframework.cache.cache.
Es liefert hauptsächlich die folgenden Methoden
// Den Wert gemäß dem angegebenen Schlüssel <T> T GET (Objektschlüssel, Klasse <T> Typ) // den angegebenen Wert auf den Cache entsprechend dem entsprechenden Schlüsselpullover Speichern (Objektschlüssel, Objektwert); // Recyceln Sie den angegebenen Wert void evict (Objektschlüssel) Speichern (Objektschlüssel) speichern.
Aus der Definition ist es nicht schwer zu erkennen, dass Cache tatsächlich eine Schlüsselwertstruktur ist. Wir bedienen den entsprechenden Wert über einen bestimmten Schlüssel.
Cache Manager
Cache ist eine Sammlung von Schlüsselwerten, aber in unserem Projekt gibt es möglicherweise unterschiedliche Caches verschiedener Geschäftsthemen wie Benutzer-Caches, Abteilungs-Caches usw. Diese Caches sind logisch getrennt. Um diese Caches zu unterscheiden, wird org.springframework.cache.cachemanager zur Verwaltung verschiedener Caches bereitgestellt. Diese Schnittstelle enthält nur zwei Methoden
// Erhalten Sie den Cache des entsprechenden Themas gemäß dem Namen Cache getCache (String -Name); // Erhalten Sie den Cache aller Topics Collection <string> getCacheNames ();
In dieser Schnittstelle dürfen das Hinzufügen und Löschen von Vorgängen nicht mit Cache durchgeführt werden. Diese Operationen sollten intern von verschiedenen CacheManager -Implementierungen abgeschlossen werden und nicht bekannt gegeben werden.
Annotationsbasierter Cache
Theoretisch ist der Cache -Betrieb von Daten für das Unternehmen selbst nicht sehr relevant. Wir sollten die Lese- und Schreibvorgänge von Cache von der Hauptcodelogik trennen. Die Art und Weise, wie die Frühling getrennt ist, basiert auf Annotation (natürlich basiert auch JSR-107 usw. auf Annotation).
Spring bietet eine Reihe von Anmerkungen, darunter @Cacheable, @Cacheput, @CacheeVict und andere Anmerkungen, um unseren Caches -Betrieb zu vereinfachen. Diese Anmerkungen befinden sich im Paket org.springframework.cache.annotation.
2. Beispiele
Ein einfaches Beispiel für die Verwendung des Spring -Starts mit Spring -Cache
Erstellen wir Schritt für Schritt ein Beispiel basierend auf Spring Boot -Cache
Erstellen Sie ein neues Spring Boot -Projekt und stellen Sie die folgenden Abhängigkeiten ein
<Depelencies> <Deponcy> <gruppe> org.springFramework.boot </GroupId> <artifactId> Spring-Boot-Starter-Cache </artifactId> </abhängig> <abhängigkeit> <gruppe org.springFramework.boot </gruppactid> <artifactid> Spring-boot-starter-web </artifactid> <artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> </artifactid> <- <gruppe> org.springframework.boot </Groupid> <artifactid> Spring-Boot-Starter-Test </artifactId> <Scope> test </scope> </abhängig> </Abhängigkeiten>
Unter ihnen ist Spring-Boot-Starter-Cache die Schlüsselabhängigkeit von Cache.
Ändern Sie die Anwendungsklasse und fügen Sie die Annotation hinzu, die Cache @enableCaching ermöglicht
@SpringBootApplication@EnableCachingPublic Class CachesimpleApplication {public static void main (String [] args) {SpringApplication.run (CachesimpleApplication.class, args); }}@EnableCache Annotation startet den Frühlings-Caching-Mechanismus, mit dem die Anwendung alle Cache-bezogenen Annotationen erkennen und mit der Arbeit beginnt. Es wird auch eine CacheManager -Bohne erstellen, die von unserer Anwendung injiziert und verwendet werden kann.
Erstellen Sie eine neue RESTController -Klasse
@RastController @RequestMapping ("/") öffentliche Klasse CacheController {@autowired Private CachetestService CachetestService; / ** * Informationen basierend auf der ID * * * @param id * @return */ @getmapping ("{id}") public String test (@PathVariable ("id") String -ID) {return CachetestService.get (id); } / ** * Informationen zu einer ID * * @param id * @return * / @Deletemapping ("{id}") public String delete (@PathVariable ("id") String -ID) {return CachetestService.delete (id); } / ** * Informationen zu einer ID speichern * * @param id * @return * / @Postmapping public String Save (@RequestParam ("id") String -ID, @RequestParam ("value") String -Wert) {return ScachTestService.save (id, value); } / ** * Informationen zu einer neuen ID * * @param id * @return * / @putmapPing ("{id}") public String update (@PathVariable ("id") String -ID, @RequestParam ("Wert") String -Wert) {return CachetestService.update (id, value); }}In dieser Klasse wird ein Dienst aufgerufen, um den tatsächlichen Betrieb des Hinzufügens, Löschens, Änderns und Überprüfens zu implementieren.
Service -Implementierung
Als nächstes möchten wir unseren Service implementieren
@ServicePublic Class SimpleCachTestServiceImPlements implementiert CachetEtService {private static Final Logger logger = loggerfactory.getLogger (SimpleCachTestServiceImpl.Class); private endgültige Karte <String, String> Entities = New HashMap <> (); public SimplyCachetestServiceImpl () {Entities.put ("1", "diese Nr. 1"); } @Autowired Private CacheManager CacheManager; @Override @cacheable (cachenemames = "test") public String get (String -ID) {// Aufzeichnung der Zeit der Datenerzeugung, verwendet, um Long Time = New Date () zu testen und zu vergleichen. GetTime (); // Drucken Sie den gebrauchten CacheManager logger.info ("The CacheManager IS" + CACHEMANAGER); // Drucken Sie den log -logger.info ("Wert durch id =" + id + ", die Zeit" + Zeit); Rückgabe "Wert abrufen durch id =" + id + ", der Wert" + Entities.get (id); } @Override public String delete (String -ID) {return entity.remove (id); } @Override public String speichern (String -ID, String -Wert) {logger.info ("Wert speichern" + Wert + "mit Schlüssel" + id); Entities.put (ID, Wert); Rückgabewert; } @Override public String update (String -ID, String -Wert) {return entity.put (id, value); }}Cache
Fügen Sie zunächst die @cacheable Annotation zur GET -Methode hinzu und führen Sie den Code -Test aus.
Wir verwenden Postman zum Testen, die Testadresse lautet http: // localhost: 8080/1, der Browser reagiert auf den Wert durch ID = 1, der Wert, der Nr. 1, die Serverkonsole druckt zwei Zeilen von Protokolls aus.
Wert Wert durch ID = 1, der Wert ist der Wert Nr. 1 Wert durch ID = 1, die Zeit beträgt 1516004770216
Wenn wir jedoch die Browseradresse erneut aktualisieren, kehrt der Browser normal zurück, aber die Konsole druckt nicht mehr. Der Grund dafür ist, dass beim zweiten Mal die Methode nicht mehr ausgeführt wird, sondern den zwischengespeicherten Wert nicht mehr ausführt. Spring -Cache zwischengespeichert den Rückgabewert der Funktion als Schlüssel im Cache mit dem Namen Test.
Hier verwenden wir die @cacheable Annotation, und die CachenNames in der Annotation geben an, welcher Cache hier gelesen wird. Hier suchen wir nach dem Cache -Objekt, dessen Schlüssel ID in der CacheName = "Test" ist.
Löschen Sie zwischengespeicherte Daten
Wenn wir im obigen Programm den angegebenen Wert über die Anforderung löschen und die Anforderung löschen und an http: // localhost: 8080/1 senden, wurde der Wert aus der Karte gelöscht. Wenn wir jedoch die Anfrage an http: // localhost: 8080/1 erhalten, können wir den Wert immer noch erhalten. Dies liegt daran, dass wir die Daten im Cache nicht gelöscht haben, wenn wir die Daten löschen. In der vorherigen GET -Methode wird das Betriebsergebnis der Methode weiterhin gespeichert. Der Frühling wird es nicht erneut lesen, sondern den Cache direkt lesen. Zu diesem Zeitpunkt fügen wir vor der Methode Anmerkungen hinzu
@Override@CacheeVict (cachenesnames = "test") public String delete (String -ID) {return entity.remove (id);}Nach dem Testen rufen Sie zuerst die GET -Anforderung an, der Rückgabewert wird korrekt als GET -Wert durch ID = 1 angezeigt. Der Wert beträgt 1
Rufen Sie dann die Anfrage an. Löschen Sie die Daten aus dem Cache und der Karte und rufen Sie die GET -Anforderung erneut auf. Zu diesem Zeitpunkt ist der Wert des Get -Werts durch ID = 1, der Wert null, was bedeutet, dass der Wert tatsächlich aus dem Cache gelöscht wurde.
Hier verwenden wir die @cacheevict Annotation. CacheNames gibt an, welche Cache -Daten gelöscht werden sollen. Standardmäßig werden die Methodenparameter als gelöschter Schlüssel verwendet.
Cache aktualisieren
Wenn das Programm diesen Punkt erreicht, ist die Anforderung des Anforderungsgremiums id = 1 & value = new11, wenn wir die Postanforderung ausführen. Zu diesem Zeitpunkt druckt die Konsole druckt Wert neuer Wert1 mit Schlüssel 1, und der Code speichert den Wert auf der Karte. Wenn wir jedoch die Get -Anforderung ausführen, werden wir feststellen, dass der Rückgabewert immer noch im vorherigen Status liegt. Das können wir verwenden
@Override@cacheput (cacheNames = "test", key = "#ID") public String speichern (String -ID, String -Wert) {logger.info ("Wert speichern" + Wert + "mit Taste" + id); return entity.put (id, value);}Wenn Sie den Code erneut ausführen, senden wir zunächst eine Löschanforderung, um die Daten aus der Karte und dem Cache zu löschen. Senden Sie dann eine Postanforderung und schreiben Sie die Daten an die Karte. Wenn Sie eine Get -Anfrage senden, werden Sie schließlich feststellen, dass der Wert jetzt korrekt abgerufen werden kann und die Konsole das Protokoll der von der Karte erhaltenen Daten nicht druckt.
Die @Cacheput -Annotation wird hier verwendet. Die Funktion dieser Annotation besteht darin, den Rückgabewert der Methode in den von CacheNames angegebenen Cache nach dem angegebenen Schlüssel zu schreiben.
In ähnlicher Weise müssen wir der Put -Methode die @cacheput -Annotation hinzufügen, damit die Änderung auch die zwischengespeicherten Daten aktualisieren kann.
Zu diesem Zeitpunkt wird eine einfache Cache -Anwendung mit Addition, Löschung, Änderung und Abfrage abgeschlossen.
3. Schlüsselpunkte
Ein paar Notizen
Beachten
@Cacheable und @cacheput werden das Ausführungsergebnis der Methode entsprechend dem angegebenen Schlüssel in den Cache einbringen. Wenn @cacheleable ausgeführt wird, wird zunächst festgestellt, ob Daten im Cache vorhanden sind. In diesem Fall wird es direkt aus dem Cache gelesen. Wenn nicht, führen Sie die Methode aus und geben Sie den Rückgabewert in den Cache ein. Die Methode mit @Cacheput wird definitiv ausgeführt
Der vollständige Beispielcode finden Sie unter https://github.com/ldwqh0/cachetest
Zusammenfassen
Das obige ist die Methode zur Verwendung von Cache -Cache im Spring Boot, der Ihnen vom Editor vorgestellt wurde. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!