Redis (Details)

Inhaltsverzeichnis

Was ist Redis?

Die Hauptfunktionen von Redis

Redis-Nutzungsszenarien

Sitzungsspeicherung

Cache-Speicher

Implementieren Sie verteilte Sperren

Warum ist Redis so schnell?

Speicherbasierte Operationen

Effiziente Datenstrukturen

Multiplexing-Modell mit mehreren E/A

Einzelthread-Ausführung

Gemeinsame Datenstrukturen in Redis

Implementierung der geordneten Redis-Liste

Ablauf der Sprungtabellenausführung

Implementierung einer verteilten Redis-Sperre

Probleme bei der Verwendung verteilter Sperren

Es kommt zu einem Deadlock

Sperre versehentlich gelöscht

Redis-Datenverluststrategie

Der Unterschied zwischen RDB und AOF

RDB

AOF

Cache-Lawine

Lösung:

Cache-Aufschlüsselung

Lösung

Cache-Penetration

 Lösung:

Zusammenfassung


Vorwort

Redis ist derzeit die beliebteste Caching-Middleware, und Entwickler stellen immer höhere Anforderungen an Redis. Die kompetente Beherrschung der Grundkenntnisse von Redis ist für einen Entwickler der Grundstein für die Entwicklung leistungsstarker und hochverfügbarer Systeme.

Was ist Redis?

Redis ist ein Open-Source-In-Memory-Datenspeichersystem, das oft als Cache-Speicher und Schlüsselwertspeicher bezeichnet wird. Es handelt sich um eine leistungsstarke, leichte Datenbank, die dafür bekannt ist, umfangreiche Datentypen und verschiedene erweiterte Funktionen zu unterstützen. Sie ist die beliebteste der NoSQL-Datenbanken und wird daher von vielen Anwendungen übernommen.

Die Hauptfunktionen von Redis

  • Speicher
  • Schlüsselwertspeicherung
  • Art der Daten
  • Beharrlichkeit
  • Veröffentlichen-Abonnieren
  • Angelegenheiten
  • Hohe Verfügbarkeit

Redis-Nutzungsszenarien

  • Sitzungsspeicherung
  • Cache-Speicher
  • Implementieren Sie verteilte Sperren

Sitzungsspeicherung

Redis kann zum Speichern von Benutzersitzungsdaten verwendet werden. Durch das Speichern von Sitzungen in Redis kann problemlos eine verteilte, hochverfügbare Sitzungsverwaltung implementiert und sichergestellt werden, dass Benutzersitzungen auf mehreren Servern konsistent sind.

Cache-Speicher

Caching ist eines der häufigsten Verwendungsszenarien von Redis, bei dem Daten, auf die häufig zugegriffen wird, in Redis gespeichert werden. Es kann die Effizienz der gesamten Anwendung verbessern und den Druck auf den Back-End-Datenbankserver verringern.

Implementieren Sie verteilte Sperren

Da Redis von Natur aus verteilte Systeme unterstützt, handelt es sich bei der Sperroperation auf Redis um eine verteilte Sperre, die den gegenseitigen Ausschluss und die gemeinsamen Ressourcen mehrerer Clients gewährleisten kann.

Warum ist Redis so schnell?

Die Hauptgründe, warum Redis schnell ist, sind folgende:

  • Speicherbasierte Operationen
  • Effiziente Datenstrukturen
  • Multiplexing-Modell mit mehreren E/A
  • Einzelthread-Ausführung

Speicherbasierte Operationen

Alle Vorgänge von Redis basieren auf dem Speicher, und die meisten Vorgänge von Redis sind einfache Lese- und Schreibfunktionen, während Zugriffe und die meisten Vorgänge in E/A verbraucht werden und E/A am schnellsten ist des Speichers sind viel schneller als die Lesevorgänge der Festplatte.

Effiziente Datenstrukturen

Redis gewährleistet die Effizienz von Redis durch eine Reihe von Datenstrukturen, die hauptsächlich effiziente Datenstrukturen wie dynamische Zeichenfolgen, Hash-Tabellen, doppelt verknüpfte Listen, komprimierte Listen, Sprungtabellen, Mengen, geordnete Mengen und andere effiziente Datenstrukturen verwenden Daten können effizient gespeichert und abgerufen werden. Dies ist die Grundvoraussetzung für die Gewährleistung einer hohen Leistung von Redis

Multiplexing-Modell mit mehreren E/A

Redis verwendet ein Mehrkanal-E/A-Multiplexing-Modell. Mehrkanal bezieht sich auf mehrere Netzwerkverbindungen, und Multiplexing bezieht sich auf mehrere E/A-Multiplexe eines Threads für den Betrieb. Dadurch kann Redis die Parallelität auf der Basis eines einzelnen Threads verarbeiten. Für Bei Anfragen wird das gemultiplexte E/A-Modell intern mithilfe des Epool-Proxys implementiert. Epool überwacht mehrere E/A-Stream-Ereignisse gleichzeitig. Wenn keine Ereignisse vorliegen, wird es blockiert.

Einzelthread-Ausführung

Die Single-Thread-Ausführung von Redis vermeidet perfekt die Probleme, die bei Multi-Threads auftreten, wie z. B. keine Sperrenkonkurrenz, Thread-Erstellung und -Zerstörung sowie Zeitverbrauch durch Thread-Planung und -Wechsel. Dies macht Redis in einzelnen Threads effizienter. Das ist es viel höher als die Multithread-Ausführung.

Gemeinsame Datenstrukturen in Redis

Es gibt 5 gemeinsame Datenstrukturen in Redis: String, Liste, Hash-Hash-Tabelle, Set-Sammlungstyp und sortierte Set-Liste.

Häufige Verwendungen dieser 5 Typen sind wie folgt:

1. Zeichenfolge. Zu den üblichen Verwendungsszenarien gehören das Speichern von Benutzersitzungsinformationen, das Speichern von Cache-Informationen und das Speichern von Ganzzahlinformationen. Sie können incr verwenden, um Ganzzahl +1 zu implementieren, und decr, um Ganzzahl -1 zu implementieren.

2. Listentyp. Zu den üblichen Verwendungsszenarien gehören die Implementierung einer einfachen Nachrichtenwarteschlange und das Speichern von Daten in einer bestimmten Liste.

3. Hash-Hash-Typ. Zu den üblichen Verwendungsszenarien gehören das Speichern von Sitzungsinformationen und Einkaufswagen zum Speichern von Produkten. Der Warenkorb eignet sich sehr gut zur Darstellung durch ein Hash-Wörterbuch. Die eindeutige Nummer der Person wird als Schlüssel des Wörterbuchs verwendet Der Wertwert kann die ID und Menge des Produkts speichern. Warten Sie auf Informationen und speichern Sie die Informationen auf der Detailseite

4. Der Set-Sammlungstyp ist eine ungültige und eindeutige Schlüsselwertsammlung. Sein Verwendungsszenario hat die Aufmerksamkeitsfunktion des Benutzers. Er kann in einer Sammlung gespeichert werden, um sicherzustellen, dass Benutzerinformationen nicht wiederholt werden.

5. Der Sammlungstyp „Sorted Set“ ist ein geordneter und eindeutiger Satz von Schlüsselwerten. Zu den häufigsten Verwendungsszenarien gehören das Speichern von Ranking-Informationen und das Verfolgen von Listenfunktionen.

Implementierung der geordneten Redis-Liste

Die geordnete Liste wird durch die Ziplist-Komprimierungsliste und die Skiplist-Sprungliste implementiert.

  1. Die komprimierte Liste wird als Byte-Array implementiert. Es handelt sich um eine lineare Datenstruktur, die von Redis entwickelt wurde, um Speicher zu sparen. Sie kann mehrere Elemente enthalten und jedes Element kann ein Byte-Array oder eine Ganzzahl sein.
  2. Eine Sprungliste ist eine geordnete Datenstruktur, die Adressen verwaltet, die auf mehrere Knoten in jedem Knoten verweisen, um einen schnellen Zugriff auf Knoten zu ermöglichen.

Hinweis: Wenn die Daten relativ klein sind, wird eine komprimierte Liste zur Speicherung verwendet. Wenn hingegen große Datenmengen vorhanden sind, wird eine komprimierte Liste zur Speicherung verwendet. Die folgenden zwei Bedingungen müssen erfüllt sein, um eine komprimierte Liste zu verwenden :

1. Die Anzahl der Elemente in einer geordneten Menge muss weniger als 128 betragen

2. Die Länge jedes im geordneten Satz gespeicherten Elementmitglieds muss weniger als 64 Byte betragen.

Wenn eine der oben genannten Bedingungen nicht erfüllt ist, wird der Sprungtabellenspeicher verwendet.

Ablauf der Sprungtabellenausführung

Die unterste Ebene der Sprungliste wird mithilfe mehrerer verknüpfter Listen implementiert.

Bei Verwendung von Skip-Tabellen ist die Abfrageeffizienz sehr hoch.

Sprungtabellenabfrage:

Nehmen wir als Beispiel die Abfrage 32 in der obigen Abbildung:

Beginnen Sie zunächst mit der obersten zweistufigen verknüpften Liste. Wenn 1 kleiner als 32 ist, verschieben Sie sie um eine Position nach hinten. 7 ist kleiner als 32. Bewegen Sie sich weiter um eine Position nach hinten. Wenn festgestellt wird, dass sie leer ist, verwenden Sie 7 als Ziel und gehen Sie zur nächsten Ebene. Suchen Sie auf der ersten Ebene. Wenn 18 kleiner als 32 ist, bewegen Sie sich weiter eine Position nach hinten. Wenn Sie feststellen, dass 77 größer als 32 ist, verwenden Sie 18 als Ziel, gehen Sie zur nächsten Ebene für Abfrage und vergleichen Sie dann die Daten nach 18 auf Ebene 0. Wir haben 32 gefunden.

Wie aus dem obigen Prozess ersichtlich ist, beginnt die Abfrage der Sprungtabelle in der obersten Ebene. Wenn der Wert des Knotens in dieser Ebene größer als der Wert des abzufragenden Knotens ist oder der Knoten in dieser Ebene null ist , wird der vorherige Knoten durchsucht. Gehen Sie als Ziel zur nächsten Ebene und fragen Sie in einer Schleife ab, bis der Knoten bekannt oder null ist, und kehrt dann zurück.

Implementierung einer verteilten Redis-Sperre

Redis unterstützt von Natur aus verteilte Systeme, daher sind die in Redis hinzugefügten Sperren verteilte Sperren. Die sogenannten verteilten Sperren sind ein logisches Konzept in Redis.

Verwenden Sie den Befehl setnx [Schlüsselwert]. Das Ergebnis der Sperrausführung ist 1, was auf Erfolg hinweist.

Verwenden Sie den Befehl del [Schlüsselwert], um die Sperre aufzuheben

Sperren über setnx Multi-Client 1

 

Wenn zu diesem Zeitpunkt Client 2 erneut zum Sperren verwendet wird, schlägt die Sperre fehl.

 

Ich entsperre es in Client 1 und Client 2 kann es erfolgreich sperren. 

Probleme bei der Verwendung verteilter Sperren

Es kommt zu einem Deadlock

Es kommt zu einem Deadlock: Der Thread, der die Sperre erhalten hat, geht offline, die Sperre wird nicht freigegeben und der Thread, der die Sperre erhalten hat, belegt nur die Sperre, was zu einem Deadlock führt.

Lösung: Fügen Sie eine Zeitüberschreitung hinzu (imitieren Sie den MySQL-Modus von 10 Sekunden) und verwenden Sie den Befehl „expire“.

Dies wird durch Festlegen eines Timeouts gelöst. Wenn die Sperre nach Ablauf des Timeouts nicht aufgehoben wird, wird das Sperrobjekt automatisch freigegeben, und es tritt kein Deadlock-Problem auf.

Sperre versehentlich gelöscht

Das Problem des versehentlichen Löschens der Sperre: Wenn die Ausführungszeit eines bestimmten Threads länger als das Timeout ist, tritt das Problem des versehentlichen Löschens der Sperre auf.

Wenn Thread 1 die Sperre erhält und das Timeout auf 10 Sekunden festlegt, dreht sich Thread 2 und wartet, aber Thread 1 benötigt tatsächlich 15 Sekunden für die Ausführung. In der 10. Sekunde wird Thread 1 gesperrt, da das Timeout abgelaufen ist. Thread 2 wird dies tun Holen Sie sich die Sperre. Wenn Thread 1 alle 15 Sekunden der Ausführung abgeschlossen hat, wird die Sperre gelöscht. Da die Sperre bereits von Thread 2 erworben wurde, löscht Thread 1 die Sperre von Thread 2. Die Sperre wird entfernt.

Lösung: Fügen Sie der Sperre eine Kennung hinzu. Stellen Sie beim Löschen fest, ob die Sperre zum aktuellen Thread gehört. Wenn sie zum aktuellen Thread gehört, löschen Sie sie. Wenn nicht, löschen Sie sie nicht.

Redis-Datenverluststrategie

Es wird angenommen, dass Redis-Daten im Speicher gespeichert werden und die Daten im Speicher nach einem Stromausfall verloren gehen. Redis verwendet Persistenztechnologie, um dieses Problem zu lösen.

Drei Arten der Redis-Persistenz:

  • Die Snapshot-Methode (RDB) schreibt Speicherdaten zu einem bestimmten Zeitpunkt in binärer Form auf die Festplatte
  • Der Dateianhängemodus (AOF) zeichnet alle Betriebsanweisungen auf (set del) und hängt sie in Textform an die Datei an.
  • Hybride Persistenz kombiniert die Vorteile von RDB und AOF. Beim Schreiben werden die aktuellen Daten in RDB und nachfolgende Daten in AOF geschrieben.

Der Unterschied zwischen RDB und AOF

RDB und AOF sind zwei Strategien für die Redis-Persistenz.

RDB

Funktionsprinzip: Zeichnen Sie die Daten zu einem bestimmten Zeitpunkt im Speicher auf und schreiben Sie sie im Binärformat auf die Festplatte

Vorteil:

  • Die Ausführungseffizienz ist relativ hoch. Da es sich um Binärdaten handelt, ist das Schreiben auf die Festplatte schneller. Auch bei der Wiederherstellung ist die Effizienz sehr hoch.
  • Die Datei ist relativ klein und nimmt weniger Speicherplatz auf der Festplatte ein.

Mangel:

Da Daten zu einem bestimmten Zeitpunkt aufgezeichnet werden, können alle Daten zu diesem Zeitpunkt verloren gehen, wenn während des Redis-Snapshots ein Fehler auftritt.

AOF

Funktionsprinzip: Hängen Sie die Redis-Protokolldatei in Textform an die Festplattendatei an. Wenn Redis neu gestartet werden muss, werden die Daten durch Wiedergabe des Inhalts der Festplattendatei wiederhergestellt.

Vorteil:

  • Die Datenintegrität ist relativ gut.
  • Da es sich bei der Datei um eine Textdatei handelt, ist sie beim Anzeigen sehr praktisch.

Mangel:

  • Aufgrund der Anhängemethode wird die Festplattendatei mit der Zeit immer größer. Wenn Redis neu gestartet werden muss, wirkt sich dies auf die Effizienz des Neustarts aus.
  • Häufiger Zugriff auf die Festplatte erfordert häufiges Schreiben von Dateien, was die Festplatte belasten kann.

Cache-Lawine

In kurzer Zeit läuft eine große Anzahl von Caches gleichzeitig ab, was dazu führt, dass eine große Anzahl von Anforderungen auf die Datenbank zugreift, was den Datenbankserver belastet und in schwerwiegenden Fällen zum Absturz des Datenbankservers führt.

Normalen Zugriff zwischenspeichern:

Zugriff nach Cache-Lawine 

 

Lösung:

  1. Sperrwarteschlange: Die Sperrwarteschlange kann über eine Synchronisierung durchgeführt werden, die eine Pufferrolle spielen kann, um zu verhindern, dass eine große Anzahl von Benutzern gleichzeitig auf die Datenbank zugreift. Der Nachteil besteht jedoch darin, dass sie die Reaktionszeit des Systems erhöht.
  2. Cache-Ablaufzeit zufällig festlegen: Um zu verhindern, dass eine große Anzahl von Caches gleichzeitig abläuft, können Sie eine zufällige Ablaufzeit für den Cache festlegen. Dadurch wird verhindert, dass eine große Anzahl von Caches gleichzeitig abläuft.
  3. Verwenden Sie den Cache der zweiten Ebene: Richten Sie zusätzlich zu Redis selbst einen Cache ein (z. B. eine Hash-Tabelle). Wenn Redis fehlschlägt, fragen Sie zuerst den Cache der zweiten Ebene ab.

Wir verwenden hauptsächlich eine zufällige Cache-Ablaufzeit

Cache-Aufschlüsselung

Cache-Aufschlüsselung bedeutet, dass ein bestimmter Hot-Cache zu einem bestimmten Zeitpunkt ausfällt und dann zu diesem Zeitpunkt eine große Anzahl gleichzeitiger Anforderungen vorliegt. Zu diesem Zeitpunkt greift diese große Anzahl gleichzeitiger Anforderungen direkt auf die Datenbank zu, was zu einem enormen Druck führt die Datenbank. Diese Situation wird als Cache-Penetration bezeichnet.

Lösung

  1. Sperrwarteschlange: Ähnlich wie bei der Cache-Avalanche-Lösung wird beim Abfragen der Datenbank eine Sperrwarteschlange verwendet und die Betriebsanforderung gepuffert, um den Betriebsdruck des Servers zu verringern.
  2. Einstellung läuft nie ab: Für einige Hotspot-Caches können wir sie so einstellen, dass sie nie ablaufen, was die Stabilität des Caches gewährleisten kann. Sie müssen jedoch darauf achten, den Hotspot-Cache rechtzeitig nach Datenänderungen zu aktualisieren, da es sonst zu Fehlern kommt in den Abfrageergebnissen. .

 Wir verwenden hauptsächlich Einstellungen, die nie ablaufen

Cache-Penetration

Cache-Penetration bedeutet, dass in der Abfragedatenbank und im Cache keine Daten vorhanden sind. Da die Datenbank keine Daten enthält, werden die Ergebnisse aus Gründen der Fehlertoleranz nicht in Redis gespeichert, sodass die Datenbank bei jeder Anfrage abgefragt wird. Dies ist eine Cache-Situation Penetration.

 Lösung:

Unabhängig davon, ob die Datenbank abgefragt wird oder nicht, werden die Ergebnisse in Redis gespeichert.

Zusammenfassung

Dieser Artikel enthält die häufigsten Interviewfragen zu Redis.

Jetzt renne ich hart, nur um das Selbst einzuholen, von dem ich einst große Hoffnungen hatte.

おすすめ

転載: blog.csdn.net/qq_63525426/article/details/132760533