Redis-Transaktionen
Redis-Transaktionen können mehrere Befehle auf einmal ausführen und bieten die folgenden drei wichtigen Garantien:
- Massenoperationen werden in einem Warteschlangen-Cache abgelegt, bevor der EXEC-Befehl gesendet wird.
- Nachdem der EXEC-Befehl empfangen wurde, geht die Transaktion in die Ausführung über. Wenn ein Befehl in der Transaktion fehlschlägt, werden die übrigen Befehle trotzdem ausgeführt.
- Während der Ausführung einer Transaktion werden von anderen Clients übermittelte Befehlsanforderungen nicht in die Abfolge der in der Transaktion ausgeführten Befehle eingefügt.
Eine Transaktion durchläuft vom Start bis zur Ausführung die folgenden drei Phasen:
- Transaktion beginnen.
- Befehle in die Warteschlange einreihen.
- Transaktion ausführen.
Beispiel
Das folgende ist ein Beispiel für eine Transaktion. Zuerst wirdMULTIverwendet, um eine Transaktion zu starten, dann werden mehrere Befehle in die Transaktion eingereiht, und schließlich wird der BefehlEXECverwendet, um die Transaktion auszulösen und alle Befehle in der Transaktion zusammen auszuführen:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C++" 3) "Programming"
Die Ausführung eines einzelnen Redis-Befehls ist atomar, aber Redis fügt Transaktionen keinen Mechanismus hinzu, um Atomarität aufrechtzuerhalten, daher ist die Ausführung von Redis-Transaktionen nicht atomar.
Eine Transaktion kann als ein gebündeltes Batch-Ausführungsskript verstanden werden, aber Batch-Befehle sind keine atomaren Operationen. Wenn ein Befehl in der Mitte fehlschlägt, verursacht dies weder ein Rollback der zuvor ausgeführten Befehle, noch verhindert es die Ausführung nachfolgender Befehle.
Dies ist die Erklärung auf der offiziellen Website. Aus der Redis-Dokumentation zuTransaktionen:
Es ist wichtig zu beachten, dass selbst wenn ein Befehl fehlschlägt, alle anderen Befehle in der Warteschlange verarbeitet werden – Redis stoppt die Verarbeitung von Befehlen nicht.
Zum Beispiel:
redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7000> set a aaa QUEUED redis 127.0.0.1:7000> set b bbb QUEUED redis 127.0.0.1:7000> set c ccc QUEUED redis 127.0.0.1:7000> exec 1) OK 2) OK 3) OK
Wenn es bei set b bbb fehlschlägt, war set a bereits erfolgreich und wird nicht zurückgerollt, und set c wird weiterhin ausgeführt.
Redis-Transaktionsbefehle
Die folgende Tabelle listet die Befehle im Zusammenhang mit Redis-Transaktionen auf:
| Nein. | Befehl und Beschreibung |
|---|---|
| 1 | DISCARD Bricht die Transaktion ab und verwirft alle Befehle im Transaktionsblock. |
| 2 | EXEC Führt alle Befehle im Transaktionsblock aus. |
| 3 | MULTI Markiert den Beginn eines Transaktionsblocks. |
| 4 | UNWATCH Hebt die Überwachung aller Schlüssel durch den WATCH-Befehl auf. |
| 5 | WATCH key [key ...] Überwacht einen (oder mehrere) Schlüssel. Wenn diese Schlüssel vor der Ausführung der Transaktion durch andere Befehle geändert werden, wird die Transaktion abgebrochen. |