Galería de mapas mentales Redis-Datenstruktur-Wissensframework-Lernen
Da es viele Redis-Datentypen gibt und verschiedene Datentypen dieselben Metadaten aufzeichnen müssen, verwendet Redis eine RedisObject-Struktur, um diese Metadaten einheitlich aufzuzeichnen. Beim Speichern des Long-Typs wird der RedisObject-Zeiger direkt einer Ganzzahl zugewiesen.
Editado a las 2022-11-14 13:53:00,Redis-Datenstruktur-Wissensframework-Lernen
Problem mit der Cache-Konsistenz
Aktualisieren Sie zuerst die Datenbank und löschen Sie dann den Cache
(1) Der Cache ist gerade abgelaufen (2) Fordern Sie A auf, die Datenbank abzufragen und einen alten Wert abzurufen (3) Fordern Sie B auf, den neuen Wert in die Datenbank zu schreiben (4) Fordern Sie B auf, den Cache zu löschen (5) Fordern Sie A auf, den gefundenen alten Wert in den Cache zu schreiben
Es kommt zu fehlerhaften Daten wie oben
Aber nur wenn 3 von 2 und 3 schneller als 2 ist, löscht B zuerst den Cache und A schreibt den Cache mit dem alten Wert.
Tatsächlich ist das Schreiben in die Datenbank viel langsamer als das Lesen. Vermeiden Sie daher langsames SQL.
Zuerst den Cache löschen und dann in die Datenbank schreiben
(1) Zuerst den Cache löschen (2) Schreiben Sie die Datenbank erneut (diese beiden Schritte sind die gleichen wie zuvor) (3) 1 Sekunde lang in den Ruhezustand versetzen und den Cache erneut löschen
Verwenden Sie asynchrones Doppellöschen
Grundoperationen
Gemeinsame Operationen
Überprüfen Sie die Anzahl und Länge
Ob es den Schlüssel oder ein bestimmtes Feld unter dem Schlüssel existiert, enthält, anhängt, erhöht oder verringert
Löschen, angegebenen Speicherort löschen, löschen und abrufen
kostenloses Thema
Art der Daten
Schlüssel
Löschen, vorhanden, anzeigen, nach Muster abgleichen (bei großen Sammlungen treten Leistungsprobleme auf),
Scan iteriert alle Schlüssel,
Liste sortieren, festlegen
Migrieren Sie von einer Redis-Instanz zu einer anderen Redis-Instanz
Legen Sie die Ablaufzeit fest, stornieren Sie sie und erhalten Sie die verbleibende Ablaufzeit des Schlüssels
Wie Redis abgelaufene Schlüssel eliminiert Es gibt zwei Möglichkeiten, Redis-Schlüssel ablaufen zu lassen: passiv und aktiv. Wenn einige Clients versuchen, darauf zuzugreifen, wird der Schlüssel erkannt und ist aktiv abgelaufen. Dies reicht natürlich nicht aus, da auf einige abgelaufene Schlüssel nie zugegriffen werden kann. Diese Schlüssel sollten ohnehin ablaufen, daher wird die Ablaufzeit der Schlüssel durch einen zeitgesteuerten Zufallstest festgelegt. Alle diese abgelaufenen Schlüssel werden aus dem Schlüsselraum gelöscht. Konkret macht Redis Folgendes zehnmal pro Sekunde: Testen Sie 20 zufällige Schlüssel auf entsprechende Ablauferkennung. Löschen Sie alle abgelaufenen Schlüssel. Wenn mehr als 25 % der Schlüssel ablaufen, wiederholen Sie Schritt 1. Dies ist ein trivialer Wahrscheinlichkeitsalgorithmus. Die Grundannahme ist, dass unsere Stichprobe die Schlüsselkontrolle ist und wir die Ablauferkennung so lange wiederholen, bis der Prozentsatz der abgelaufenen Schlüssel weniger als 25 % beträgt, was bedeutet, dass zu einem bestimmten Zeitpunkt um Fast ein Viertel der abgelaufenen Schlüssel wird gelöscht.
Satz
Sdiff ruft die Elemente ab, die in der Menge nicht vorhanden sind. SDiff a b ist äquivalent zu a-b
Sdiff Store speichert den Differenzsatz in einem Schlüssel
Finden Sie die Vereinigung mehrerer Mengen, die in einem Schlüssel gespeichert werden können
SInter übernimmt die Schnittmenge. SInterStore schreibt die Schnittmenge in einen Schlüssel
Aufführen
BLOCK-Operation, die einen Wert am Anfang und am Ende der Warteschlange blockiert
Sie können angeben, dass Werte aus mehreren Warteschlangen abgerufen werden sollen
Wenn die Warteschlange leer ist, wird der Client blockiert, bis ein Schreibvorgang erfolgt. Sie können ein Timeout angeben und nach dem Timeout Null zurückgeben.
Sperrvorgänge sorgen für Fairness
Redis 2.4 und 2.6 unterscheiden sich. Wenn mehrere Werte gleichzeitig geschrieben werden, z. B. a, b, c, erhält der Client, dessen Schlüssel blockiert ist, a in 2.4 und c in 2.6.
Wenn der Client nach dem Löschen des Werts vom Server auflegt, bevor der Wert verarbeitet wird, geht der Wert verloren. Der Nachrichtenbestätigungsmechanismus von RabbitMQ kann dieses Problem lösen.
Sie können die Blockierungsoperation von List in Kombination mit atomaren Operationen anderer Datentypen in derselben Transaktion verwenden, um dem Client Blockierungsverhalten bereitzustellen.
Ist es möglich, fair verteilte Sperren zu erreichen?
Ähnlich wie die von List in Java bereitgestellten Operationen wird LTrim hinzugefügt, um Werte in einem bestimmten Bereich abzufangen.
Entfernen Sie das letzte Element aus der Liste und fügen Sie es in eine andere Liste ein
kostenloses Thema
bestellte Abholung
Sie können Reduktionsoperationen für die Vereinigung mehrerer geordneter Mengen durchführen und dabei SUM, MIN und MAX unterstützen.
Gibt die Rangfolge eines Schlüssels in einer geordneten Menge zurück
Sie können einen bestimmten Wertebereich in einem geordneten Satz erhalten; Sie können auch die Mindest- und Höchstwerte angeben, um den Satz in diesem Bereich in Seiten abzufragen.
Iterieren Sie über eine Sammlung
Transaktion
betrachten
Der WATCH-Befehl kann einen oder mehrere Schlüssel überwachen. Sobald einer der Schlüssel geändert (oder gelöscht) wird, werden nachfolgende Transaktionen nicht ausgeführt. Die Überwachung wird fortgesetzt, bis der EXEC-Befehl ausgeführt wird. Solange der Wert geändert wird, wird die Transaktion nicht ausgeführt. Dies entspricht der Redis-Überprüfung während der Ausführung.
Da die Funktion des WATCH-Befehls nur darin besteht, die Ausführung einer nachfolgenden Transaktion zu verhindern, wenn der überwachte Schlüsselwert geändert wird, kann er nicht garantieren, dass andere Clients den Schlüsselwert nicht ändern. Daher müssen wir ihn im Allgemeinen erneut ausführen EXEC-Ausführung, nachdem die gesamte Funktion fehlgeschlagen ist. Garantiert mit Schlaufe
Nach der Ausführung des EXEC-Befehls wird die Überwachung aller Schlüssel abgebrochen. Wenn Sie die Befehle in der Transaktion nicht ausführen möchten, können Sie die Überwachung auch mit dem UNWATCH-Befehl abbrechen. In einigen Geschäftsszenarien führen wir nach der Überwachung möglicherweise nicht unbedingt Transaktionsvorgänge durch.
Der Watch-Befehl ist eine optimistische Sperrtechnologie, so dass nachfolgende gültige Änderungen nicht wirksam werden. Diese Methode kann normalerweise verwendet werden, um die Race-Bedingungen zu reduzieren
Exec führt tatsächlich alle Anweisungen in der Transaktion aus und löscht den Überwachungsbefehl.
Die Antwort des Exec-Befehls ist ein Array, das mit der Ausführungsreihenfolge des Befehls übereinstimmt.
Auch wenn ein/einige Befehle in der Transaktion nicht ausgeführt werden können, werden andere Befehle in der Transaktionswarteschlange weiterhin ausgeführt – Redis stoppt die Ausführung der Befehle in der Transaktion nicht.
Bevor die Transaktion EXEC ausführt, können Fehler in eingereihten Befehlen auftreten. Beispielsweise kann der Befehl zu Syntaxfehlern führen (falsche Parameteranzahl, falsche Parameternamen usw.). In diesem Fall stoppt der Client die Ausführung der Transaktion
Alle vom Beginn des Mutil-Befehls bis zum Exec-Befehl ausgeführten Befehle werden in die Transaktionswarteschlange eingegeben.
Hash
Ob vorhanden, hinzufügen, löschen, alle Schlüssel und Werte abrufen, Hash-Sammlung iterieren
Erhöhen Sie den Hashwert eines Schlüssels. Wenn der Schlüssel nicht vorhanden ist, setzen Sie ihn auf 0, um den Wert zu erhöhen.
kostenloses Thema
Fallstricke bei der Datenstruktur
Wenn die Zeichenfolge erweitert werden muss und sie kleiner als 1 MB ist, wird sie verdoppelt. Wenn sie größer als 1 MB ist, wird sie jedes Mal nur um 1 MB erweitert
Wenn der Selbstinkrementwert den Maximalwert überschreitet, wird ein Fehler gemeldet.
Bei Datenstrukturen vom Typ Container gilt: Wenn der Container nicht vorhanden ist, erstellen Sie ihn. Wenn das Element nicht mehr vorhanden ist, löschen Sie den Container.
Verteilte Sperre
Einzelknotenlösung (nicht rote Sperre)
Holen Sie sich die Sperre
Hash an einen Clusterknoten
Wenn es nicht vorhanden ist, legen Sie den Sperrpfad fest. Legen Sie die Ablaufzeit fest.
Beim Sperren handelt es sich um einen Wert, der die Client-ID festlegt
Richten Sie einen Watchdog ein und aktualisieren Sie die Sperre regelmäßig. Dies kann mithilfe einer Verzögerungswarteschlange implementiert werden.
Wenn die Sperre nicht erworben wird, sollten Sie erwägen, sie zu blockieren und auf den Erwerb zu warten.
Freischalten
Wenn die Ablaufzeit nicht festgelegt ist, führt dies zu einem Deadlock-Problem.
a) Sobald in Redis ein Master-Slave-Wechsel stattfindet, können einige Sperren verloren gehen.
Vergleiche mit zk
Die von Zookeeper implementierte verteilte Sperre hat tatsächlich einen Nachteil: Die Leistung ist möglicherweise nicht so hoch wie die des Cache-Dienstes. Denn jedes Mal, wenn eine Sperre erstellt und freigegeben wird, müssen vorübergehende Knoten dynamisch erstellt und zerstört werden, um die Sperrfunktion zu implementieren. Das Erstellen und Löschen von Knoten in ZK kann nur über den Leader-Server erfolgen, und dann werden die Daten nicht auf allen Follower-Maschinen geteilt. Parallelitätsprobleme, möglicherweise Netzwerkjitter, die Sitzungsverbindung zwischen dem Client und dem ZK-Cluster ist unterbrochen, der ZK-Cluster geht davon aus, dass der Client ausgefallen ist, und löscht den temporären Knoten. Zu diesem Zeitpunkt können andere Clients die verteilte Sperre erhalten .
Redis ist schwierig, Gerechtigkeit zu erreichen
Redlock
In der verteilten Version des Algorithmus gehen wir davon aus, dass wir N Redis-Hosts haben. Die Knoten sind völlig unabhängig, daher verwenden wir keine Replikation oder ein anderes implizites Koordinationssystem. Wir haben beschrieben, wie Sie Sperren innerhalb einer einzelnen Instanz sicher erwerben und freigeben. Wir gehen davon aus, dass der Algorithmus diese Methode zum Erlangen und Freigeben von Sperren in einer einzigen Instanz verwendet. In unserem Beispiel setzen wir N = 5, was ein sinnvoller Wert ist. Wir müssen also 5 Redis-Masterserver auf verschiedenen Computern oder virtuellen Maschinen ausführen, um sicherzustellen, dass sie weitgehend unabhängig voneinander ausfallen. Um die Sperre zu erhalten, führt der Client die folgenden Vorgänge aus: 1. Es wird die aktuelle Zeit in Millisekunden abgerufen. 2. Es wird versucht, die Sperre in allen N Instanzen der Reihe nach zu erhalten, wobei in allen Instanzen derselbe Schlüsselname und Zufallswert verwendet wird. Während Schritt 2, wenn die Sperre in jeder Instanz festgelegt wird, benötigt der Client eine kleine Zeitüberschreitung im Vergleich zur Gesamtzeit für die automatische Freigabe der Sperre, um sie zu erhalten. Wenn die Autorelease-Zeit beispielsweise 10 Sekunden beträgt, kann das Timeout im Bereich von ~5–50 ms liegen. Dies verhindert, dass Clients über längere Zeiträume blockiert bleiben und versuchen, mit einem Redis-Knoten zu kommunizieren, was aber scheitert: Wenn eine Instanz nicht verfügbar ist, sollten wir versuchen, so schnell wie möglich mit der nächsten Instanz zu kommunizieren. 3. Der Client berechnet die zum Erwerb der Sperre erforderliche Zeit, indem er den in Schritt 1 erhaltenen Zeitstempel von der aktuellen Zeit abzieht. Eine Sperre gilt nur dann als erworben, wenn der Client die Sperre in den meisten Fällen (mindestens 3) erwerben kann und die Gesamtzeit, die zum Erwerb der Sperre verstrichen ist, kürzer als die Sperrgültigkeitszeit ist. 4. Wenn eine Sperre erworben wird, wird ihre Gültigkeitszeit als die anfängliche Gültigkeitszeit abzüglich der verstrichenen Zeit betrachtet, wie in Schritt 3 berechnet. 5. Wenn der Client die Sperre aus irgendeinem Grund nicht erhalten kann (N/2 1 Instanzen können nicht gesperrt werden oder negative Gültigkeitszeit), versucht er, alle Instanzen zu entsperren (auch wenn er denkt, dass er nicht sperren kann).
Wenn ein Knoten hängt, besteht kein Risiko, dass die Sperre aufgehoben wird.
Zwischenspeicher
Ungültig
Legen Sie einen zufälligen Wert für die Ausfallzeit fest, um einen kollektiven Ausfall zu vermeiden
Implementierung der Datenstruktur
Anwendungsszenarien
zset
Liste der Benutzerbeitrags-IDs aufzeichnen. Schnellanzeige
Hotlist-Beitrags-ID-Liste aufzeichnen. Gesamt-Hotlist, Kategorie-Hotlist
Wird zum Aufzeichnen von Eins-zu-Viele verwendet, und die Party mit Vielen kann nicht unbedingt wiederholt werden.
Zeichnen Sie eine bestimmte Sammlung auf, die sich auf den Benutzer oder das Gesamtsystem beziehen kann.
Hash
Erfassen Sie die Anzahl der Likes, Kommentare und Klicks auf einen Beitrag.
Notieren Sie den Titel, die Zusammenfassung, den Autor, das Cover usw. des Beitrags.
Aktuellen Hot-Post-Inhalt zwischenspeichern (Der Post-Inhalt ist sehr umfangreich und nicht zum Abrufen aus der Datenbank geeignet.)
Liste
Notieren Sie die Liste der verwandten Artikel des Beitrags. Empfehlen Sie verwandte Beiträge basierend auf dem Inhalt.
Bitmap
Wird als Bool-Array oder benutzerdefiniertes Bit-Array verwendet, hauptsächlich um Speicherplatz zu sparen
HyperLogLog
Wird zur groben Berechnung statistischer Werte nach der Deduplizierung verwendet.
Beispielsweise muss Website-UV wiederholte Besuche filtern
Sie können nur die Gesamtzahl addieren und erhalten, aber Sie können nicht ermitteln, ob ein bestimmter Wert oder alle Elemente vorhanden sind.
Blütenfilter
Wird verwendet, um Duplikate zu entfernen. Ermitteln Sie, ob ein Element in der Liste vorhanden ist
Wenn es existiert, existiert es nicht unbedingt wirklich Wenn es nicht existiert, existiert es definitiv nicht
Erwägen Sie, Benutzern nicht besuchte Ressourcen zu empfehlen
Erwägen Sie, Ressourcen nicht mehrfach wiederzuverwenden.
Eine gewisse Fehlerrate muss toleriert werden, das heißt, auf die Ressource kann zwar nicht zugegriffen werden, sie gilt aber als zugegriffen.
Verwenden Sie mehrere Hash-Algorithmen und setzen Sie die Bits der Schlüsselzuordnung auf 1.
Wenn es nicht existiert, existiert es definitiv nicht!!!!
Es gibt nur die Befehle „add“ und „exist“ (mehrere können überprüft werden).
Sie können den Filter mit anfänglichen Parametern festlegen. error_rate ist die Fehlerrate. Je niedriger der Wert, desto größer die Kapazität. initial_size ist der geschätzte Gesamtbetrag. Der Gesamtbetrag sollte entsprechend dem tatsächlichen Szenario festgelegt werden.
Redis-Zelle
Wenn das Projekt nicht groß ist und die Wartungskosten nicht hoch sind, können Sie redsi-cell direkt verwenden. Andernfalls können Sie eine differenzierte Steuerung jedes Serviceknotens in Betracht ziehen, um den Fluss zu begrenzen, und diese mit der entsprechenden Lastausgleichsstrategie implementieren.
Verwenden Sie „zset“ und „score“, um das Zeitfenster zu umkreisen und zu zählen, wie oft dasselbe Verhalten für denselben Benutzer innerhalb des Zeitfensters auftritt. Wenn die Anzahl der aktuellen Grenzwerte zu groß ist, ist sie möglicherweise nicht anwendbar, z. B. 1.000 Mal pro Sekunde .
CL.DHROTTLE-Test 100 400 60 3
Testschlüsselkapazität 100 (maximale Parallelität) bis zu 400 Mal innerhalb von 60 Sekunden. Diesmal werden 3 Kapazitäten beantragt
1: Ob erfolgreich, 0: Erfolg, 1: Ablehnen 2: Die Kapazität des Token-Buckets, die Größe ist der Anfangswert 1 3: Im aktuellen Token-Bucket verfügbare Token 4: Wenn die Anfrage abgelehnt wird, gibt dieser Wert an, wie lange es dauern wird, bis das Token erneut zum Funnel-Bucket hinzugefügt wird. Einheit: Sekunden, die als Wiederholungszeit verwendet werden kann. 5: Gibt an, wie lange es dauern wird, bis die Token im Token-Bucket voll sind.
Trichteralgorithmus
spezielle Datenstruktur
Komprimierte verknüpfte Liste
Es besteht aus komprimierten verknüpften Listen oder Arrays, um den zusätzlichen Speicheraufwand gewöhnlicher verknüpfter Listen zu vermeiden.
Eine doppelt verknüpfte Liste, die so viel Speicherplatz wie möglich spart
Speichern Sie eine Zeichenfolge oder Ganzzahl
Sparen Sie Speicherplatz im Detail, indem Sie die Codierung mit variabler Länge für die Wertespeicherung verwenden
Jedes Element verfügt über eine separate Anzahl von Ziffern, um die Datenlänge und den Typ des Elements zu kennzeichnen.
Implementierung der zugrunde liegenden Datenstrukturen von Hash, Liste und Zset
Merkmale
1) Die interne Darstellung ist ein kontinuierliches Speicherarray, in dem Daten kompakt angeordnet sind.
2) Sie können eine doppelt verknüpfte Listenstruktur simulieren und mit O(1)-Zeitkomplexität in die Warteschlange ein- und aussteigen.
3) Der neue Löschvorgang beinhaltet eine Neuzuweisung oder Freigabe von Speicher, was die Komplexität des Vorgangs erhöht.
4) Lese- und Schreibvorgänge beinhalten komplexe Zeigerbewegungen, und die Zeitkomplexität im ungünstigsten Fall beträgt O(n2).
5) Geeignet zum Speichern kleiner Objekte und Daten begrenzter Länge.
1) Bei der Verwendung von Ziplist für Szenarien mit hohen Leistungsanforderungen wird empfohlen, dass die Länge 1000 nicht überschreitet und die Größe jedes Elements innerhalb von 512 Bytes kontrolliert wird.
Sprungtisch
Die Sprungliste unterstützt die O(logN)-Durchschnittssuche und die Worst-Case-O(N)-Komplexitätssuche.
Warum nicht Bäume oder ausgeglichene Bäume anstelle von Sprungtischen verwenden?
Die Implementierung der Sprungtabelle ist sehr einfach und kann das O(logN)-Niveau erreichen.
schnell verlinkte Liste
Die komprimierte verknüpfte Liste wird mithilfe von Zeigern zu einer verknüpften Liste verknüpft
Der Standardwert jeder Ziplist beträgt 8 KB (konfigurierbar).
Betrieb und Instandhaltung
Monitor
2) Verwenden Sie den Befehl info Commandstats, um die durchschnittliche Befehlszeit zu ermitteln, einschließlich der Anzahl der Aufrufe für jeden Befehl. , die insgesamt benötigte Zeit, die durchschnittlich benötigte Zeit, in Mikrosekunden.
Meister-Sklave
Die Replikationsfunktion von Redis ist in zwei Vorgänge unterteilt: Synchronisierung (Sync) und Befehlsweitergabe (Befehlsweitergabe):
Synchronisationsoperationen werden verwendet, um den Datenbankstatus vom Server abzurufen Update auf den aktuellen Datenbankstand des Hauptservers;
Der Befehlsweitergabevorgang wird verwendet, um den Datenbankstatus auf dem Hauptserver zu ändern. Wenn der Datenbankstatus des Master-Slave-Servers inkonsistent ist, lassen Sie den Master-Slave-Server los Die Datenbank des Servers wird in einen konsistenten Zustand zurückversetzt.
Lese- und Schreibtrennung
Die Trennung von Lesen und Schreiben eignet sich für große Zugriffe (so groß, dass sich eine einzelne Redis-Maschine sehr langsam anfühlt), und der Schreibvorgang ist viel kleiner als der Lesevorgang.
Wenn die Anzahl der Leseanforderungen die der Schreibanforderungen bei weitem übersteigt, sind die Kosten für das Kopieren der Clusterdaten deutlich geringer als die Kosten für die Leseanforderungen. Wenn wir gleichzeitig Dateninkonsistenzen bis zu einem gewissen Grad akzeptieren können, können wir Lesen und Schreiben trennen.
Redis-Cluster
charakteristisch
1. Alle Redis-Knoten sind miteinander verbunden (PING-PONG-Mechanismus) und intern wird ein Binärprotokoll verwendet, um Übertragungsgeschwindigkeit und Bandbreite zu optimieren.
2. Der Ausfall eines Knotens wird erst dann wirksam, wenn mehr als die Hälfte der Knoten im Cluster Ausfälle erkennen.
3. Der Client ist direkt mit dem Redis-Knoten verbunden, ohne dass eine Zwischen-Proxy-Schicht erforderlich ist. Der Client muss sich nicht mit allen Knoten im Cluster verbinden, sondern nur mit jedem verfügbaren Knoten im Cluster.
4. Redis-Cluster ordnet alle physischen Knoten dem Steckplatz [0-16383] zu (nicht unbedingt gleichmäßig verteilt), und der Cluster ist für die Aufrechterhaltung des Knotenwerts <->Steckplatz<-> verantwortlich.
Jeder Redis-Knoten muss einen Befehl ausführen und den Slot angeben, für den er verantwortlich ist.
Cluster fügt Slots {slot_index1} {slot_index 2} {slot_index 3} hinzu
5. Der Redis-Cluster ist vorab in 16384 Buckets unterteilt. Wenn ein Schlüsselwert im Redis-Cluster platziert werden muss, wird anhand des Werts von CRC16 (Schlüssel) Mod 16384 entschieden, in welchem Bucket ein Schlüssel platziert werden soll.
Jede Redis-Instanz ist sich der Existenz anderer Knoten bewusst
Eine starke Konsistenz kann nicht garantiert werden
1. Ihr Client schreibt auf den Hauptserverknoten B 2. Der Hauptserverknoten B antwortet Ihrem Client zur Bestätigung. 3. Master-Serverknoten B gibt den Schreibvorgang an seine Slave-Server B1, B2 und B3 weiter.
Wenn nach Schritt 2 keine Daten vom Slave-Server gesendet werden und B auflegt, geht der Schlüssel verloren (der Schlüssel geht während des Fehlers definitiv verloren).
Fehlertoleranz
Der Wahlprozess umfasst die Teilnahme aller Master im Cluster. Wenn mehr als die Hälfte der Masterknoten länger als (Clusterknoten-Timeout) mit dem ausgefallenen Knoten kommunizieren, gilt der Knoten als fehlerhaft und der Failover-Vorgang wird automatisch ausgeführt Ausgelöst.
(2): Wann ist der gesamte Cluster nicht mehr verfügbar (cluster_state:fail)? a: Wenn ein Master im Cluster ausfällt und der aktuelle Master keinen Slave hat, tritt der Cluster in den Fehlerzustand ein. Dies kann auch als Eintritt in den Fehlerzustand verstanden werden, wenn die Steckplatzzuordnung des Clusters [0-16383] nicht abgeschlossen ist. b: Wenn mehr als die Hälfte der Master im Cluster ausfällt, unabhängig davon, ob ein Slave-Cluster in den Ausfallzustand eintritt.
Wenn der Cluster nicht verfügbar ist, sind alle Vorgänge auf dem Cluster nicht verfügbar und es wird der Fehler ((error) CLUSTERDOWN Der Cluster ist ausgefallen) empfangen.
Failover
1. Alle Slave-Knoten des Offline-Masterknotens werden ausgewählt, um einen neuen Masterknoten auszuwählen. 2. Der ausgewählte Slave-Knoten führt den Befehl „Slave No One“ aus und wird zum neuen Master-Knoten. 3. Der neue Master-Knoten widerruft alle Slot-Zuweisungen zum Offline-Master-Knoten und weist diese Slots sich selbst zu. 4. Der neue Master-Knoten sendet eine Pong-Nachricht an den Cluster. Diese Pong-Nachricht ermöglicht es anderen Knoten im Cluster, sofort zu erfahren, dass der Knoten von einem Slave-Knoten zu einem Master-Knoten gewechselt ist und dass der Master-Knoten den Server übernommen hat der ursprünglich offline war. Der Slot, den der Knoten verwaltet. 5. Der neue Master-Knoten beginnt, Befehlsanfragen zu akzeptieren, die sich auf den Steckplatz beziehen, für dessen Verarbeitung er verantwortlich ist, und der Failover-Vorgang ist abgeschlossen.
Herr-Sklave-Wahl
1. Wenn der Slave-Knoten feststellt, dass der Master-Knoten, den er repliziert, offline gegangen ist, sendet der Slave-Knoten (hier können mehrere Slave-Knoten Anfragen stellen) eine Cluster_Type_Failover_auth_request-Nachricht an den Cluster und erfordert Stimmrechte (verantwortlich für die Verarbeitung von Slots). Der Masterknoten stimmt für diesen Knoten. 2. Der Master-Knoten, der die Nachricht „cluster_type_failover_auth_request“ empfängt, beurteilt anhand seiner eigenen Bedingungen, ob er mit dem Slave-Knoten einverstanden ist, der neue Master-Knoten zu werden (die aktuelle Epoche des initiierenden Abstimmungsknotens ist nicht niedriger als die aktuelle Epoche des Abstimmungsknotens). ). Wenn es zustimmt, wird eine Cluster_type_failover_auth_ack-Nachricht zurückgegeben. 3. Wenn die Nachricht „cluster_type_failover_auth_ack“ vom Knoten empfangen wird, wird die Anzahl der Stimmen um 1 erhöht. 4. Wenn die Stimmen eines Slave-Knotens größer oder gleich der Hälfte der Master-Knoten im Cluster sind (größer oder gleich N/2 1), wird dieser Knoten zum neuen Master-Knoten. Wenn während eines Konfigurationszyklus kein Slave-Knoten genügend Stimmen erhält, tritt der Cluster in einen neuen Konfigurationszyklus ein und die Wahlen werden hier abgehalten, bis ein neuer Master-Knoten gewählt wird.
Alle Slave-Knoten können Meinungen darüber einholen, ob sie Master werden können (diejenigen, die abstimmen, stimmen nur für ihre eigenen größeren Knoten), und mehr als die Hälfte von ihnen kann (n 1)/2 sein
Vielleicht kann ich mich nicht entscheiden
Einschränkungen
1. Derzeit werden nur Stapeloperationen von Schlüsseln auf demselben Steckplatz unterstützt. 2. Derzeit werden nur Schlüsseltransaktionen auf demselben Slot unterstützt; 3. Es kann nur Datenbank 0 verwendet werden (jede Redis-Instanz verfügt über 16 Datenbanken, die über den Befehl select {index} umgeschaltet werden können). 4. Ein großer Schlüssel (z. B. Hash, Liste) kann nicht verschiedenen Knoten zugeordnet werden. 5. Derzeit unterstützt die Cluster-Master-Slave-Replikation nur eine Ebene und keine verschachtelte Baumarchitektur.
Beim Erweitern
Schritt
1. An den Zielknoten senden Cluster-Setslot {slot_index} importiert {source_node_id} 2. An den Quellknoten senden Cluster-Setslot {slot_index} migriert {target_node_id} 3. Ausführung der Quellknotenschleife Cluster getkeysinslot {slot_index} {count(Anzahl der Schlüssel)} 4. Der Quellknoten führt den Schlüssel aus und migriert ihn über die Pipeline zum Zielknoten. migriere {target_ip} {target_port} „“ 0 {timeout} Schlüssel {key1} {key2} {key3} 5. Wiederholen Sie die Schritte 3 und 4 6. Senden Sie Benachrichtigungen an alle Masterknoten im Cluster Cluster-Setslot {slot_index} Knoten {target_nodeid}
Jeder Knoten kennt den Clusterknoten, der jedem Steckplatz entspricht.
Wenn der Knoten die Befehlsanforderung empfängt, fragt er, ob er sie selbst verarbeiten kann. Wenn nicht, gibt er einen Verschiebungsfehler zurück und gibt ihn an den Knoten zurück Der Client leitet ihn zur Ausführung an. Sobald der Schlüssel ausgeführt wird, wird er an den vom verschobenen Fehler bereitgestellten Knoten weitergeleitet.
Codis
Zugriffsschicht: Die Zugriffsmethode kann VIP sein oder Jodis über Java-Code aufrufen und dann verschiedene Codis-Proxy-Adressen verbinden und aufrufen, um hochverfügbare LVS- und HA-Funktionen zu erreichen.
Proxy-Schicht: Dann verwendet die mittlere Schicht Codis-Proxy und Zookeeper, um die Datenrichtung und -verteilung zu verarbeiten. Durch den crc32-Algorithmus werden die Schlüssel gleichmäßig in einem bestimmten Slot verschiedener Redis verteilt, um ein Striping ähnlich wie bei Raid0 zu erreichen Bei Codis müssen Slots manuell zugewiesen werden. Nach Codis3.2 werden Slots automatisch zugewiesen, was sehr praktisch ist.
Datenschicht: Schließlich speichert Codis-Proxy die Daten auf dem eigentlichen Redis-Server-Hauptserver. Da der Autor von Codis, Huang Dongxu, großen Wert auf Datenkonsistenz legt und keine durch Datenverzögerungen verursachten Dateninkonsistenzen zulässt, war dies bei der Architektur nicht der Fall Von Anfang an werden Master-Slave-Lesen und -Schreiben getrennt. Der Slave-Server wird nur als redundante Architektur für das Failover verwendet, und zookeeper ruft Redis-Sentinel auf, um die Failover-Funktion zu implementieren.
In Codis teilt Codis alle Schlüssel in 1024 Slots auf. Diese 1024 Slots entsprechen dem Redis-Cluster. In Codis wird die Zuordnungsbeziehung zwischen diesen 1024 Slots und der Redis-Instanz beibehalten. Dieser Steckplatz ist konfigurierbar und kann auf 2048 oder 4096 eingestellt werden. Es hängt davon ab, wie viele Knoten Ihr Redis hat. Wenn es zu viele sind, können Sie mehr Slots festlegen.
Wenn das Codis-Dashboard von Codis die Slot-Informationen ändert, überwachen andere Codis-Knoten die ZooKeeper-Slot-Änderungen und synchronisieren sie rechtzeitig. Wie im Bild gezeigt:
zk ist für die Synchronisierung der Slot-Informationen verantwortlich.
Prioritätswarteschlange
sortiertes Set
Liste
Verwenden Sie mehrere Warteschlangen, um Prioritätswarteschlangen zu implementieren. Aufgaben mit unterschiedlicher Priorität werden in unterschiedliche Warteschlangen eingegeben
Wenn Verbraucher Daten aus der Warteschlange abrufen, unterstützen sie gleichzeitig das Abrufen von Daten aus mehreren Warteschlangen mit Prioritätsreihenfolge.
verstopft
Das Starten mehrerer Verbraucher bedeutet, dass mehrere Clients gestartet werden, um Daten abzurufen.
Nachrichtenwarteschlange
pubsub
verwenden
Abonnenten können ein oder mehrere passende Abonnementthemen abonnieren
Der Verlag veröffentlicht ein bestimmtes Thema und einen bestimmten Wert
Veröffentlichte Themen werden sofort an Verbraucher weitergeleitet, die das Thema abonnieren. Wenn keine Verbraucher vorhanden sind, wird die Nachricht verworfen.
Risiko
Es besteht die Gefahr eines Nachrichtenverlusts (wenn das Gerät ausfällt, die Netzwerkverbindung getrennt wird oder das Netzwerk unterbrochen wird und Nachrichten verloren gehen).
Aufgrund dieser Funktion besteht bei einfachem Pubsub die Gefahr, dass Antworten verloren gehen.
Die Zuverlässigkeit der Daten kann nicht garantiert werden
Es gibt keine Garantie dafür, dass es mindestens einmal passiert
Die Erweiterung ist nicht flexibel und es gibt keine Möglichkeit, den Verbrauch durch die Hinzufügung weiterer Verbraucher zu beschleunigen.
Sie können mehrere Kanäle nutzen und mehrmals anhören.
Liste
Liste
1. Wenn in der angegebenen Liste kein zu entfernendes Element vorhanden ist, wird die Verbindung durch den BRPOP-Befehl blockiert, bis die Wartezeit abgelaufen ist oder ein entfernbares Element gefunden wird. 2. Wenn mehrere Schlüsselparameter angegeben werden, wird jede Liste der Reihe nach entsprechend dem Parameterschlüssel überprüft und das Endelement der ersten nicht leeren Liste wird angezeigt. Darüber hinaus verhält sich BRPOP bis auf die Position des Popup-Elements genauso wie BLPOP.
Wenn keine Aufgaben in der Liste vorhanden sind, wird die Verbindung blockiert Es gibt eine Zeitüberschreitung für die Verbindungsblockierung. Wenn die Zeitüberschreitung auf 0 eingestellt ist, können Sie drahtlos warten, bis eine Meldung angezeigt wird.
Mit pubsub können Sie Verbraucher auch darüber informieren, dass sie aus der Liste konsumieren können.
Es eignet sich für Abonnements und Veröffentlichungen zwischen zwei Unternehmen zwischen A und B. Schwieriger wird es, wenn mehrere Geschäftsbereiche unterschiedliche Verbraucher bedeuten.
ACK-Implementierung
Verwalten Sie zwei Warteschlangen: Pending-Warteschlange und Ausführungstabelle (Hash-Tabelle).
Worker werden als ThreadPool definiert. Nachdem sie von der ausstehenden Warteschlange in die Warteschlange gestellt wurden, weisen die Arbeiter einen Thread (einzelnen Worker) zu, um die Nachricht zu verarbeiten. Hängen Sie einen aktuellen Zeitstempel und einen aktuellen Thread-Namen an die Zielnachricht an, schreiben Sie sie in die Verarbeitungstabelle, und der Worker verarbeitet die Nachricht anschließend Fertigstellung Löschen Sie die Informationen in der Aufgabentabelle selbst.
Aktivieren Sie eine geplante Aufgabe, scannen Sie die Ausführungswarteschlange in regelmäßigen Abständen und überprüfen Sie den Zeitstempel jedes Elements. Wenn eine Zeitüberschreitung auftritt, prüft der ThreadPoolExecutor des Workers, ob der Thread vorhanden ist, und die aktuelle Aufgabenausführung wird abgebrochen wird zurückgesetzt. Zum Schluss entfernen Sie die Aufgabe aus der Ausführungswarteschlange und verschieben sie zurück in die Ausstehende Warteschlange.
Sie können zset zum Sortieren verwenden.
Vermeiden Sie übermäßigen Einsatz von Redis. Verwenden Sie Redis nur für die Dinge, in denen Sie am besten sind, und tun Sie die Dinge, in denen Sie nicht gut sind. Je mehr Sie tun, desto mehr werden Sie entdecken. Je mehr Fallstricke es gibt, desto schwieriger ist es am Ende, aufzugeben. Ein falsches Design in der frühen Phase führt zu einer hohen Ausfallrate und zu hohen Transformationskosten. Die Bedienung und Wartung von Rabbitmq ist ebenfalls sehr einfach und kann mit dem Geschäftssystem kombiniert werden.