Heim >Datenbank >Redis >Wie implementiert Redis verteilte Sperren? Lassen Sie uns über Implementierungsmethoden sprechen

Wie implementiert Redis verteilte Sperren? Lassen Sie uns über Implementierungsmethoden sprechen

青灯夜游
青灯夜游nach vorne
2021-11-30 19:25:071920Durchsuche

Wie verwende ich Redis, um verteilte Sperren zu implementieren? Der folgende Artikel stellt Ihnen die Methode zur Implementierung verteilter Sperren basierend auf Redis vor. Ich hoffe, er wird Ihnen hilfreich sein!

Wie implementiert Redis verteilte Sperren? Lassen Sie uns über Implementierungsmethoden sprechen

In einem verteilten System werden Sie auf Situationen stoßen, in denen von mehreren Knoten gemeinsam genutzte Ressourcen gesperrt werden müssen. In diesem Fall müssen verteilte Sperren verwendet werden. Verteilte Sperren werden normalerweise in einem gemeinsam genutzten Speichersystem gespeichert und können von mehreren Knoten gemeinsam genutzt und darauf zugegriffen werden. [Verwandte Empfehlungen: Redis-Video-Tutorial]

Die Essenz einer Sperre

Einfach ausgedrückt kann eine Sperre durch eine Variable dargestellt werden. Beispielsweise kann in einem Einzelmaschinen-Multithread-Programm die Sperre einer bestimmten Ressource durch ein Datenbit dargestellt werden. Das heißt, 0 bedeutet, dass auf keine Ressource zugegriffen werden kann, und 1 bedeutet, dass die Ressourcensperre von einem anderen Thread erworben wurde und nicht darauf zugegriffen werden kann.

Das Erlangen und Aufheben der Sperre einer bestimmten Ressource besteht im Wesentlichen darin, den Wert dieser Variablen abzurufen und zu ändern. Wenn der Wert 0 ist, ändern Sie ihn in 1, um den Erfassungsprozess abzuschließen. Wenn der Wert, auf den zugegriffen wird, nicht 0 ist, schlägt die Erfassung der Sperre fehl, und der Wert der Variablen, die die Sperre darstellt, wird geändert 0. Tatsächlich handelt es sich um den Vorgang des Aufhebens der Sperre.

In einem verteilten Szenario ist die Methode zum Implementieren von Sperren dieselbe, mit der Ausnahme, dass die Variable, die die Ressourcensperre darstellt, in einem gemeinsam genutzten Speichersystem gespeichert werden muss. Dieses gemeinsam genutzte Speichersystem kann Redis oder jedes andere System sein, das Datenspeicherung bereitstellen kann.

Verteilte Sperrenimplementierung basierend auf Redis

Schritt 1: Vorläufige Implementierung der Funktion

Für den Fall der Verwendung von Redis als dieses gemeinsam genutzte Speichersystem ist die Variable, die die Sperre einer bestimmten Ressource darstellt, ein Schlüssel im Redis-Wertepaar . Wenn die Ressource, die mit einer verteilten Sperre hinzugefügt werden muss, Ressource_a heißt, können wir den Schlüssel der Sperrvariablen von Ressource_a in Redis lock_a aufrufen.

Wenn Knoten 1 beispielsweise eine Sperre erwerben muss, greift er auf den Wert von lock_a in Redis zu. Unter der Annahme, dass der erhaltene Wert 0 ist, schließt Knoten 1 den Sperrvorgang ab, nachdem dieser Wert auf 1 gesetzt wurde. Zu diesem Zeitpunkt muss Knoten zwei auch auf den Wert von lock_a in Redis zugreifen und feststellen, dass der Wert 1 ist, was darauf hinweist, dass die Sperre von einem anderen Knoten erworben und nicht freigegeben wurde Zwei können die Ressource „resource_a“ nicht sperren.

Wenn Knoten eins die Sperre aufheben muss, muss er lediglich den Wert von lock_a in Redis auf 0 setzen, um die Sperrfreigabe abzuschließen. Danach können andere Knoten die Ressourcensperre erneut erwerben.

Schritt 2: Atomisieren Sie den Sperrvorgang

In der obigen Beschreibung ist das Sperren kein einzelner Vorgang, sondern umfasst mehrere Schritte: Lesen der Sperrvariablen, Beurteilen des Werts der Variablen und Ändern der Sperrvariablen. Diese drei Operationen müssen atomar sein.

In Redis gibt es einen SETNX-Befehl, der zum Festlegen des Werts eines Schlüssel-Wert-Paares verwendet wird. Anders als der SET-Befehl bestimmt er im Voraus, ob das Schlüssel-Wert-Paar vorhanden ist Wenn er nicht vorhanden ist, wird die Einstellung des Werts ausgeführt, andernfalls wird nichts ausgeführt. SETNX bedeutet „SET, wenn Nnicht eXist“. Die Verwendung ist die gleiche wie bei SET:

SETNX lock_a 1

Wenn Sie eine Sperre erwerben müssen, verwenden Sie den SETNX-Befehl, um einen Wert für lock_a festzulegen. Wenn die Einstellung erfolgreich ist, wird die Sperre erworben Die Sperre wird nicht erworben. Wenn die Sperre aufgehoben werden muss, verwenden Sie einfach die DEL-Operation, um das Schlüssel-Wert-Paar zu löschen.

Dadurch wird der atomare Vorgang des Erwerbs und Freigebens von Sperren erreicht.

Schritt 3: Verhindern Sie, dass die Sperre nicht aufgehoben wird.

Als nächstes ist zu berücksichtigen, dass die Sperre aufgrund von Programmausnahmen und anderen Gründen niemals aufgehoben wird bleiben Es wird von ihm gehalten und kann nicht freigegeben werden, und andere Knoten können nicht auf die Ressource zugreifen.

Um diese Situation zu vermeiden, müssen wir die Ablaufzeit für die Sperrvariable festlegen. Wenn die Sperrvariable abläuft, können wir die Sperre erneut anfordern und so dieses Problem vermeiden.

Der SETNX-Befehl verfügt nicht über eine Option zum Festlegen der Ablaufzeit. Glücklicherweise bietet Redis die NX-Option zum Simulieren von SETNX für den SET-Befehl. Wir können die Ablaufzeit wie folgt festlegen:

SET lock_a 1 NX PX 10000

Der obige Befehl bedeutet, dass wenn lock_a Existiert nicht, wird der Wert auf 1 gesetzt und läuft nach 10 Sekunden ab.

Schritt 4: Wer sperrt und gibt

Das letzte Problem besteht darin, dass, wenn Knoten eins die Sperre erhält und Knoten zwei aus irgendeinem Grund eine DEL-Operation ausführt, andere Knoten die Sperre erneut erwerben können.

Um dieses Problem zu lösen, können wir den in der Sperrvariablen gespeicherten Inhalt ändern. Wenn wir in der vorherigen Logik eine Sperre beantragen, stellen wir fest, ob die Sperrvariable vorhanden ist, und sie hat wenig mit dem darin gespeicherten Wert zu tun. Daher können wir diesen Wert verwenden.

Wenn beim Sperren der Wert als eindeutige Kennung jedes Knotens gespeichert wird, wird der Wert beurteilt, bevor die Sperre aufgehoben und DEL ausgeführt wird. Anschließend können Sie zunächst beurteilen, ob die Sperre dem aktuellen Knoten hinzugefügt wurde. Ja. Wenn ja, Lassen Sie es dann los und erkennen Sie so: „Wer das Schloss verriegelt, gibt es frei“.

In diesem Teil gibt es keine einzelne Anweisung, die die Vorgänge des Lesens, Beurteilens und Löschens der Sperrvariablen abschließen kann. Daher kann sie mithilfe eines Lua-Skripts implementiert werden. Rufen Sie den Wert der aktuellen Sperrvariablen im Skript ab und vergleichen Sie ihn mit der angegebenen Knotenkennung. Wenn er übereinstimmt, wird der Löschvorgang ausgeführt.

Wenn Sie die Sperre aufheben, führen Sie einfach das Lua-Skript aus.

Schritt 5: Hochverfügbarkeit implementieren

Nachdem die Funktionen verbessert wurden, implementieren Sie schließlich die Hochverfügbarkeit. Wenn wir ein einzelnes Redis als gemeinsames Speichersystem für verteilte Sperren verwenden, sind alle mit verteilten Sperren verbundenen Teile nicht mehr verfügbar. Dies macht die Sperren sehr anfällig, was aus Gründen der hohen Verfügbarkeit sehr nützlich ist.

Zu diesem Zeitpunkt ist es notwendig, den von Antirez, dem Autor von Redis, vorgeschlagenen verteilten Sperralgorithmus Redlock zu entfernen. Kurz gesagt, der Sperrantragsteller wird aufgefordert, Sperren von mehreren unabhängigen Redis-Instanzen anzufordern. Wenn der Sperrvorgang für mehr als die Hälfte der Redis-Instanzen abgeschlossen werden kann, wird die Sperre erfolgreich erworben, andernfalls schlägt der Erwerb fehl.

Solange beim Aufheben der Sperre das Lua-Skript, das die Sperrvariable erfolgreich löscht, auf mehr als der Hälfte der Instanzen ausgeführt wird, gilt dies als erfolgreich.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Einführung in die Programmierung! !

Das obige ist der detaillierte Inhalt vonWie implementiert Redis verteilte Sperren? Lassen Sie uns über Implementierungsmethoden sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen