Mit der Entwicklung von Internetanwendungen sind verteilte Systeme zu einem unvermeidlichen Trend geworden. In einem verteilten System ist eine Dateninteraktion zwischen mehreren Diensten erforderlich, und diese Dateninteraktionen können als eine Reihe von Transaktionen betrachtet werden. Wenn mehrere Dienste gleichzeitig Transaktionen bearbeiten, ist eine Parallelitätskontrolle erforderlich.
Redis ist eine leistungsstarke Schlüsselwertdatenbank, die in verteilten Systemen weit verbreitet ist. Es unterstützt eine Vielzahl von Datenstrukturen und Befehlen, einschließlich Transaktionen und Überwachung, was es zu einer guten Wahl für die Parallelitätskontrolle in verteilten Systemen macht. In diesem Artikel wird detailliert beschrieben, wie Redis die Parallelitätskontrolle verteilter Transaktionen implementiert.
1. Redis-Transaktion
Redis-Transaktion ist eine atomare Operationssequenz. Diese Vorgänge können in einen einzigen Befehl gepackt und zur Ausführung in einem separaten Schritt an den Redis-Server übergeben werden, was die Atomizität der Transaktion gewährleistet. In einer Redis-Transaktion können Sie den MULTI-Befehl zum Starten der Transaktion, den EXEC-Befehl zum Senden der Transaktion und den DISCARD-Befehl zum Abbrechen der Transaktion verwenden.
Befehle in einer Redis-Transaktion können nach dem Start der Transaktion kontinuierlich ausgeführt werden, ohne dass für jeden Befehl eine Anfrage gesendet werden muss. Nachdem der Client alle Befehle ausgeführt hat, kann er mit dem EXEC-Befehl Befehle stapelweise an den Redis-Server senden. Sollten bei der Ausführung einer Transaktion Fehler auftreten, bricht Redis die Transaktion ab und verbietet alle Änderungen. Dadurch wird sichergestellt, dass alle Vorgänge in einer Transaktion ausgeführt werden oder keine ausgeführt werden.
2. Redis-Überwachung
Redis-Überwachung ist der Schlüssel zur Realisierung verteilter Transaktionen durch Redis. Es verwendet den WATCH-Befehl, um einen oder mehrere Schlüssel in der Datenbank zu überwachen. In Datentypen wie LIST, SET, ZSET, HASH und STRING muss der überwachte Schlüssel vorhanden sein. Wenn während der Überwachung Änderungen an diesen Schlüsseln auftreten, wird die Transaktion nicht erfolgreich festgeschrieben. Während der Überwachung kann der Client mit dem MULTI-Befehl eine weitere Transaktion starten.
Zum Beispiel verwendet der folgende Code die Redis-Überwachung:
WATCH balance balance = GET balance balance = balance - 10 MULTI SET balance $balance EXEC
Dieser Code überwacht den Schlüssel mit dem Namen „balance“, verwendet den GET-Befehl, um die Daten von diesem Schlüssel abzurufen, und subtrahiert dann 10 von den Daten. Anschließend starten Sie mit dem MULTI-Befehl die Transaktion und schreiben die Daten zurück in „balance“.
Wenn andere Clients in dieser Transaktion ebenfalls den „Saldo“-Schlüssel überwachen und diesen Schlüssel ändern, bevor der Client den MULTI-Befehl ausführt, schlägt die Transaktion fehl. Wenn die Transaktion erfolgreich übermittelt wurde, können andere Clients den überwachten Schlüssel nicht ändern, bevor alle in der Transaktion enthaltenen Vorgänge auf dem Redis-Server ausgeführt wurden.
3. Verteilte Redis-Sperre
Um Konkurrenz- und Deadlock-Probleme zu vermeiden, die durch den gleichzeitigen Aufruf von Redis-Überwachungsbefehlen auf mehreren Clients verursacht werden, können verteilte Sperren verwendet werden. Redis bietet zwei Arten verteilter Sperren: eigenständige Sperren und Cluster-Sperren.
1. Einzelmaschinensperre
Einzelmaschinensperre ist die einfachste verteilte Sperrimplementierung. Bei einer eigenständigen Sperre können Sie mit dem Befehl SETNX einen Schlüsselwert für die Sperre festlegen. Der folgende Code verwendet beispielsweise eine eigenständige Sperre:
SETNX lock_key $current_time
Dieser Code setzt einen Wert auf „lock_key“. Wenn dieser Schlüssel vorher nicht existiert, ist die Einstellung erfolgreich und es wird 1 zurückgegeben. Andernfalls wird 0 zurückgegeben, was darauf hinweist, dass die Sperre fehlgeschlagen ist. Während des Sperrzeitraums können andere Clients diesen Schlüssel nicht ändern. Zu diesem Zeitpunkt kann der Client seine eigenen Vorgänge ausführen. Wenn der Client den Vorgang abschließt, muss er den Befehl DEL verwenden, um die Sperre aufzuheben. Dadurch wird „lock_key“ gelöscht und entsperrt.
2. Cluster-Sperre
Cluster-Sperre ist eine leistungsfähigere verteilte Sperrenimplementierung. Bei Cluster-Sperren kann der Redlock-Algorithmus für die Sperrung mehrerer Knoten verwendet werden. Der Redlock-Algorithmus ist ein verteilter Sperralgorithmus, der auf Taktsynchronisation basiert. Beim Redlock-Algorithmus erwirbt der Client zunächst eine Sperre und verwendet die aktuelle Zeit als Ablaufzeit der Sperre. Der Client muss außerdem Sperren von anderen Redis-Servern erhalten, um sicherzustellen, dass diese Sperre über mehrere Knoten hinweg konsistent ist. Während des Sperrzeitraums können Clients ihre eigenen Vorgänge ausführen. Wenn der Client den Vorgang abschließt, muss die Sperre aufgehoben werden. Dadurch wird die Sperre aufgehoben und die Sperre auf allen Redis-Servern gleichzeitig aufgehoben.
4. Zusammenfassung
Bei der Entwicklung von Internetanwendungen sind verteilte Transaktionen und Parallelitätskontrolle sehr wichtig. Redis bietet Mechanismen wie Transaktionen, Überwachung und verteilte Sperren, was es zu einer guten Wahl für die Parallelitätskontrolle in verteilten Systemen macht. Die Kenntnis dieser Mechanismen kann Entwicklern dabei helfen, verteilte Systeme besser zu entwerfen und zu entwickeln sowie verteilte Transaktions- und Parallelitätskontrollprobleme zu lösen.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der von Redis implementierten Parallelitätskontrolle verteilter Transaktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!