Redis implementiert verteilte Sperren
1. Führen Sie setnx entsprechend dem lockKey-Bereich aus (Satz nicht vorhanden, wenn der Schlüsselwert leer ist, setzen Sie ihn normal und geben Sie 1 zurück, andernfalls wird er zurückgegeben). nicht gesetzt werden Und 0) zurückgeben. Wenn die Einstellung erfolgreich ist, bedeutet dies, dass die Sperre erhalten wurde, andernfalls wurde die Sperre nicht erhalten.
2. Wenn die Sperre nicht erhalten wird, gehen Sie zu Redis, um den dem Schlüssel entsprechenden Wert zu erhalten. Auf dem Schlüssel speichern wir einen Zeitstempel (ausgedrückt in Millisekunden, t1). ), Um einen Deadlock zu vermeiden und andere Clients die Sperre länger als eine bestimmte Zeit (5 Sekunden) zu belegen, wird der aktuelle Zeitstempel des Clients verwendet und mit dem gespeicherten Zeitstempel verglichen. (Empfohlenes Lernen: Redis-Video-Tutorial)
3. Wenn das Nutzungszeitlimit des Schlüssels nicht überschritten wurde, geben Sie false zurück, um anzuzeigen, dass andere Personen den Schlüssel belegen und nicht erzwungen werden können um es zu verwenden; wenn das Zeitlimit überschritten wurde, können wir es entsperren und unseren Zeitstempel verwenden, um den Wert dieses Feldes zu ersetzen.
4. Wenn der Wert jedoch nicht abgerufen werden kann, nachdem setnx fehlschlägt, bedeutet dies, dass die Sperre vor dem Vorgang aufgehoben wurde. Zu diesem Zeitpunkt ist es am besten, die setnx-Methode erneut auszuführen zu erhalten Sein Wert wird verwendet, um die Sperre zu erhalten.
Sperre freigeben: Schlüssel in Redis löschen
Zookeeper implementiert verteilte Sperre
Basierend auf temporären sequentiellen Knoten:
1 Das Ende ruft die Methode create() auf, um einen Knoten mit dem Namen „locknode/guid-lock-“ zu erstellen. Es ist zu beachten, dass der Erstellungstyp des Knotens hier auf EPHEMERAL_SEQUENTIAL eingestellt werden muss.
2. Der Client ruft die Methode getChildren("locknode") auf, um alle erstellten untergeordneten Knoten abzurufen.
3. Nachdem der Client die Pfade aller untergeordneten Knoten erhalten hat und feststellt, dass der Knoten, den er in Schritt 1 erstellt hat, die kleinste Sequenznummer unter allen Knoten hat, wird davon ausgegangen, dass der Client die Sperre erhalten hat.
4. Wenn der erstellte Knoten nicht die kleinste Sequenznummer unter allen Knoten hat, wird der größte Knoten mit einer kleineren Sequenznummer als der von Ihnen erstellte Knoten überwacht und wartet. Bis sich der überwachte untergeordnete Knoten das nächste Mal ändert, wird der untergeordnete Knoten erneut erfasst, um zu bestimmen, ob die Sperre erworben werden soll.
Das Aufheben der Sperre ist relativ einfach. Löschen Sie einfach den von Ihnen erstellten untergeordneten Knoten.
Unterschied:
Redis verteilte Sperre. Tatsächlich müssen Sie ständig versuchen, die Sperre selbst zu erhalten, was mehr Leistung verbraucht
zk verteilte Sperre, wenn Sie die Sperre nicht erhalten können, registrieren Sie einfach einen Listener. Sie müssen nicht ständig aktiv versuchen, die Sperre zu erhalten, und der Leistungsaufwand ist gering
Ein weiterer Punkt ist, dass, wenn es sich um Redis handelt, der Client, der die Sperre erwirbt, fehlerhaft ist oder auflegt, die Sperre nur nach dem Warten auf die Zeitüberschreitungszeit wie bei zk aufgehoben werden kann, da dadurch ein temporärer Znode erstellt wird Solange der Client auflegt, ist der Znode verschwunden und wird zu diesem Zeitpunkt automatisch freigegeben.
Weitere technische Artikel zu Redis finden Sie in der Einführung in die Redis-Datenbank Spalte „Nutzungsanleitung“ zum Lernen!
Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen verteilten ZK- und Redis-Sperren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!