Verteilte Sperren können tatsächlich so verstanden werden: Steuern des verteilten Systems, um gemeinsam genutzte Ressourcen ordnungsgemäß zu betreiben, und Aufrechterhaltung der Konsistenz durch gegenseitigen Ausschluss.
Ein unangemessenes Beispiel: (empfohlenes Lernen: Redis-Video-Tutorial)
Annahme Die gemeinsam genutzte Ressource ist Ein Haus mit verschiedenen Büchern besteht aus Personen, die das Haus zum Lesen betreten möchten. Das verteilte Schloss stellt sicher, dass das Haus nur eine Tür hat und jeweils nur eine Person eintreten kann Schlüssel. Dann wollen viele Leute ein Buch lesen, okay, stellen Sie sich an, die erste Person nimmt den Schlüssel, öffnet die Tür, geht hinein, um zu lesen, und schließt die Tür ab. Dann hat die zweite Person den Schlüssel nicht, also warten Sie einfach. Warten Sie, bis der erste herauskommt, und dann bekommen Sie ihn. Gehen Sie mit dem Schlüssel hinein und so weiter.
Umsetzungsprinzip
Gegenseitige Exklusivität
Stellen Sie sicher, dass es nur einen Kunden gleichzeitig gibt. Der Client kann die Sperre erhalten, das heißt, er kann mit den gemeinsam genutzten Ressourcen arbeiten
Sicherheit
Nur der gesperrte Dienst kann eine Entsperrberechtigung haben, d dass a abfragt und feststellt, dass die Sperre gehalten wird, und sich auf die Entsperrung vorbereitet. Zu diesem Zeitpunkt hält a plötzlich einige Sperren, und dann erhält B die Sperre, weil die Sperre von A abgelaufen ist, und B erhält die Sperre Gleichzeitig führt A weiterhin den zweiten Schritt zum Entsperren aus. Wenn keine Überprüfung durchgeführt wird, wird die von B gehaltene Sperre gelöscht
Deadlock vermeidenWenn ein Deadlock auftritt , alle nachfolgenden Dienste können die Sperre nicht erhalten und es können keine weiteren Vorgänge für gemeinsam genutzte Ressourcen ausgeführt werden
Stellen Sie sicher, dass Sperr- und Entsperrvorgänge atomare Vorgänge sindDies ist tatsächlich ein Problem bei der Implementierung verteilter Sperren. Angenommen, a verwendet Redis, um verteilte Sperren zu implementieren.
Angenommen, die Operation zum Hinzufügen einer Sperre ist in zwei Schritte unterteilt:
1, Schlüssel festlegen Set (Schlüssel, Wert) 2, Ablaufzeit für Schlüssel festlegen
Angenommen, das Programm stürzt nun ab, nachdem a gerade implementiert wurde. Dies führte zu einem Deadlock, ohne dass eine Ablaufzeit für den Schlüssel festgelegt wurde
So implementieren Sie verteilte SperrenEs gibt viele Möglichkeiten, verteilte Sperren zu implementieren. Solange die oben genannten Bedingungen erfüllt sind, können verteilte Sperren implementiert werden, z. B. Datenbank, Redis, Zookeeper . Hier werde ich zunächst darüber sprechen, wie man mit Redis verteilte Sperren implementiert.
Der Schlüssel zur Implementierung verteilter Sperren besteht darin, zusätzlich zum verteilten Anwendungsserver einen Speicherserver zum Speichern von Sperrinformationen zu erstellen Zeit können wir leicht an Redis denken. Zuerst müssen wir einen Redis-Server erstellen und den Redis-Server zum Speichern von Sperrinformationen verwenden.Verwenden Sie Redis, um verteilte Sperren zu implementieren
Verwenden Sie den Redis-Befehl set key value NX EX max-lock-time, um Sperren zu implementieren
Verwenden Sie den Redis-Befehl EVAL, um das Entsperren zu implementieren.
Bei der Implementierung sind mehrere wichtige Punkte zu beachten:1 Die Sperrinformationen müssen ablaufen und eine Zeitüberschreitung aufweisen, und ein Thread darf dies nicht zulassen Das Halten einer Sperre über einen längeren Zeitraum kann zu einem Deadlock führen.
2. Nur ein Thread kann gleichzeitig die Sperre erwerben.
Mehrere zu verwendende Redis-Befehle:setnx(key, value): „set if not exits“, wenn der Schlüsselwert nicht existiert, dann erfolgreich Zum Cache hinzugefügt und 1 zurückgegeben, andernfalls 0.
get(key): Rufen Sie den Wert ab, der dem Schlüssel entspricht, oder geben Sie Null zurück, wenn er nicht existiert.
getset(key, value): Rufen Sie zuerst den dem Schlüssel entsprechenden Wert ab, geben Sie Null zurück, wenn er nicht existiert, und aktualisieren Sie dann den alten Wert auf den neuen Wert.
expire(key, seconds): Legen Sie die Gültigkeitsdauer des Schlüsselwerts auf Sekunden fest.
Weitere technische Artikel zum Thema Redis finden Sie in der Spalte
Einführung in das Redis-Datenbanknutzungs-TutorialDas obige ist der detaillierte Inhalt vonWas ist eine verteilte Redis-Sperre?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!