Von der Hölle zum Himmel: Erhöhen Sie die Leistung der App mit Redis

Willkommen zu meiner neuen Serie“ Von der Hölle in den Himmel “. Diese Serie handelt von verschiedenen Fällen von Programmierern, die sich mit Problemen befassen, die jeder an einem typischen Tag finden kann. In diesem ersten Beitrag werden wir Redis als Second-Level-Cache-Layer mit Spring Boot implementieren.

Einführung

Ich habe an einigen Projekten gearbeitet und bin auf mehrere Leistungsprobleme gestoßen. Dieses Problem beruhte hauptsächlich darauf, dass dieselben Daten mehrmals am selben Endpunkt gelesen wurden. Die Verwendung von Second-Layer-Cache ist eine gängige Lösung für dieses Problem, und genau das werden wir heute tun! Sie werden sehen, wie einfach es sein wird, Redis mit Spring Boot als Cache-Layer zu integrieren.

Was ist Redis?

Redis ist eine In-Memory-Datenstruktur, die als Datenbank oder Cache verwendet wird. In-Memory zu sein, bietet einen enormen Leistungsvorteil; Lesen und Schreiben sind viel schneller als das Speichern auf der Festplatte. Es bietet auch eine Möglichkeit, Daten unter Verwendung von RDB und AOF zu speichern, wodurch es perfekt ist, die Daten beim Neustart des Servers beizubehalten.

Implementierung

Abhängigkeiten und Konfiguration

Ihr Projekt benötigt spring-boot-starter-data-redis Abhängigkeit, um ordnungsgemäß mit Spring Boot zu arbeiten. Dann müssen wir Redis und den Cache konfigurieren, was ziemlich einfach ist, indem wir die automatische Konfiguration von Spring Boot nutzen, wie im folgenden Abschnitt gezeigt:

spring.redis.url=redis://user:pwd@example.com:6379
spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server. Leave empty if no password
spring.redis.port=6379 # Redis server port.
spring.cache.redis.cache-null-values=true # Allow caching null values.
spring.cache.redis.key-prefix=project\_key # Key prefix.
spring.cache.redis.time-to-live=60000ms # Entry expiration. By default the entries never expire.
spring.cache.redis.use-key-prefix=true # Whether to use the key prefix when writing to Redis.

@EnableCaching ist eine erforderliche Anmerkung, die in einer @Configuration-Klasse festgelegt ist, die verwendet wird, damit Spring alle Dateien des Projekts scannen und die Anmerkungsaktion des Caches ausführen kann.

Caching

Stellen wir uns vor, wir sind ein einzigartiger Token-Dienstleister und wir haben eine Liste von Kunden, die diese Token aus irgendeinem Grund generieren können. Jeder Client muss eine zu validierende ID senden, bevor das Token generiert wird. Derselbe Client kann Millionen von Token generieren, was bedeutet, dass er millionenfach versuchen wird, den Client zu bekommen; Hier kommt der Cache zum Einsatz.

public class Client implemenets Serializable{

  private String clientName;

//Getters, setters, etc...

Angesichts dieses Szenarios müssen wir unseren Service sehr optimieren, stellen Sie sich vor, Millionen von Kunden generieren Token; Der Server würde zusammenbrechen. Spring Boot bietet eine lose gekoppelte Cache-Schicht, die Annotationen für das Caching verwendet, was bedeutet, dass wir jede Cache-Implementierung verwenden können.

@Cacheable(value="client", key="#clientId")
public Client getClient(String clientId){
   return clientRepository.findById(clientId);
}

@CacheEvict(value="client", key="#clientId", condition = "#key != null")
public Client deleteClient(String clientId){
   return clientRepository.deleteById(clientId);
}

@CachePut(value="client", key="#client.clientId")
public Client saveOrUpdateClient(Client client){
   return clientRepository.save(client);
}
  • @Cachefähig ermöglicht die Methode getClient(id) nach einem Client im „Client“-Cache mit einem bestimmten Schlüssel zu suchen, bevor tatsächlich versucht wird, die Methode auszuführen.
  • @CacheEvict löscht jeden Eintrag im Cache durch den angegebenen Schlüssel. Ich habe eine Bedingung hinzugefügt, um Ausnahmen zu vermeiden
  • @CachePut führt die Methode immer aus und speichert das Ergebnis im Cache.

Nützliche Anmerkungen

Es gibt andere Anmerkungen, die wir verwenden können, um unseren Code zu vereinfachen oder sogar ein neues Szenario zu lösen, z. B. wenn wir einen Client aktualisieren und gleichzeitig den Token-Cache löschen möchten. Das ist, wenn Sie brauchen @Caching können Sie mehrere Aktionen in einer einzigen Methode festlegen, wie im folgenden Snippet gezeigt:

//small example that will save a client into the cache and delete all tokens by the given client id
@Caching(@CachePut(value="client", key="#client.clientId"), 
@CacheEvict(value="tokens", key="#client.clientId", allEntries=true))

Wir können uns auch bewerben @CacheConfig in einer Klasse, um die Cache-Namen und den Schlüsselgenerator auf Klassenebene zu konfigurieren, was Ihnen die Kosten für das Hinzufügen des Cache-Namens zu jeder Anmerkung erspart.

@CacheConfig(cacheNames="clients") 
public class ClientService {...}

Similar Posts

Leave a Reply

Your email address will not be published.