Lassen Sie uns über Transaktionen in Redis sprechen: Transaktionsmodus, Lua-Skript
青灯夜游
Freigeben: 2023-04-10 19:29:36
nach vorne
1566 Leute haben es durchsucht
Dieser Artikel vermittelt Ihnen ein umfassendes Verständnis der Redis-Transaktionen und vergleicht die beiden Modi von Redis-Transaktionen (Transaktionsmodus und Lua-Skript). Ich hoffe, dass er für alle hilfreich ist!
Um genau zu sein, umfassen Redis-Transaktionen zwei Modi: Transaktionsmodus und Lua-Skript#🎜 🎜 #.
Lassen Sie uns zunächst über die Schlussfolgerung sprechen: Das Transaktionsmodell von Redis weist die folgenden Merkmale auf:
Garantieisolation; #🎜🎜 ##🎜 🎜# Haltbarkeit kann nicht garantiert werden;
hat einen gewissen Grad an Atomizität, unterstützt aber kein Rollback;
Das Konzept der Konsistenz ist anders, vorausgesetzt, der Kern Konsistenz ist Unter der Semantik von Einschränkungen können Redis-Transaktionen Konsistenz gewährleisten.
Aber das Lua-Skript hat praktischere Szenarien. Es ist eine gewisse Atomizität, aber wenn das Skript einen Fehler meldet, wird die Transaktion nicht zurückgesetzt. Lua-Skripte können die Isolation gewährleisten und können nachfolgende Schritte perfekt unterstützen, abhängig von den Ergebnissen der vorherigen Schritte
Redis-Transaktionen umfassen die folgenden Befehle:
Seriennummer
Befehl und Beschreibung
1 # 🎜🎜#MULTI Markiert den Beginn eines Transaktionsblocks.
2
EXEC führt alle Befehle innerhalb des Transaktionsblocks aus.
3
DISCARD bricht die Transaktion ab und bricht die Ausführung aller Befehle innerhalb des Transaktionsblocks ab.
4
WATCH-Taste [Taste ...] Beobachten Sie eine (oder mehrere) Taste, wenn diese (oder wenn diese) Tasten geändert werden Durch andere Befehle wird die Transaktion unterbrochen.
5
UNWATCH bricht die Überwachung aller Tasten durch den WATCH-Befehl ab.
Transaktion besteht aus drei Phasen:
Transaktion wird geöffnet, mit MULTI markiert dieser Befehl den Client, der den Befehl ausführt, vom nicht-transaktionalen Zustand in den transaktionalen Zustand zu wechseln;
Befehl in die Warteschlange stellen, nachdem MULTI die Transaktion geöffnet hat, wird der Befehl des Clients angezeigt wird nicht sofort ausgeführt, sondern in eine Transaktionswarteschlange gestellt.
Führen Sie die Transaktion aus oder verwerfen Sie sie. Wenn ein EXEC-Befehl empfangen wird, wird der Befehl in der Transaktionswarteschlange ausgeführt. Wenn es DISCARD ist, wird die Transaktion verworfen.
Das Folgende zeigt ein Beispiel einer Transaktion.
1
redis> MULTI
2
OK
3
redis> SET msg "hello world"
4
QUEUED
5
redis> GET msg
6
QUEUED
7
redis> EXEC
8
1) OK
9
1) hello world
Nach dem Login kopieren
Haben Sie hier eine Frage? Kann der Redis-Schlüssel beim Starten einer Transaktion geändert werden?
Bevor die Transaktion den EXEC-Befehl ausführt, kann der Redis-Schlüssel noch geändert werden.
Bevor die Transaktion gestartet wird, können wir den Befehl watch verwenden, um den Redis-Schlüssel zu überwachen. Bevor die Transaktion ausgeführt wird, ändern wir den Schlüsselwert. Wenn die Transaktion fehlschlägt, wird nil zurückgegeben.
Durch das obige Beispiel kann der Watch-Befehl „einen Effekt erzielen, der dem optimistischen Sperren ähnelt“.
2 ACID der Transaktion
2.1 AtomizitätAtomizität bedeutet: Alle Vorgänge in einer Transaktion sind entweder vollständig abgeschlossen oder nicht abgeschlossen und enden nicht in einer Zwischenverbindung. Wenn während der Ausführung der Transaktion ein Fehler auftritt, wird sie auf den Zustand vor Beginn der Transaktion zurückgesetzt, als ob die Transaktion nie ausgeführt worden wäre.
Erstes Beispiel:
Vor der Ausführung des EXEC-Befehls ist der vom Client gesendete Betriebsbefehl falsch, z. B. ein Syntaxfehler oder ein nicht vorhandener Befehl.
1
redis> MULTI
2
OK
3
redis> SET msg "other msg"
4
QUEUED
5
redis> wrongcommand ### 故意写错误的命令
6
(error) ERR unknown command 'wrongcommand'
7
redis> EXEC
8
(error) EXECABORT Transaction discarded because of previous errors.
9
redis> GET msg
10
"hello world"
Nach dem Login kopieren
In diesem Beispiel haben wir einen Befehl verwendet, der nicht existiert, was dazu führte, dass das Einreihen in die Warteschlange fehlschlug und die gesamte Transaktion nicht ausgeführt werden konnte.
Zweites Beispiel:
Wenn die Transaktionsoperation in die Warteschlange gestellt wird, stimmen die Datentypen des Befehls und der Operation nicht überein. Das Einreihen in die Warteschlange ist normal, aber die Ausführung des EXEC-Befehls ist abnormal.
1
redis> MULTI
2
OK
3
redis> SET msg "other msg"
4
QUEUED
5
redis> SET mystring "I am a string"
6
QUEUED
7
redis> HMSET mystring name "test"
8
QUEUED
9
redis> SET msg "after"
10
QUEUED
11
redis> EXEC
12
1) OK
13
2) OK
14
3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
15
4) OK
16
redis> GET msg
17
"after"
Nach dem Login kopieren
Wenn in diesem Beispiel ein Fehler auftritt, wenn Redis den EXEC-Befehl ausführt, beendet Redis die Ausführung anderer Befehle nicht und die Transaktion wird nicht zurückgesetzt, da die Ausführung eines bestimmten Befehls fehlschlägt.
Zusammenfassend ist mein Verständnis der Atomizität von Redis-Transaktionen wie folgt:
Wenn beim Einreihen des Befehls ein Fehler gemeldet wird, wird die Transaktionsausführung abgebrochen, um die Atomizität sicherzustellen.
Das ist normal eingereiht, und nach der Ausführung des EXEC-Befehls wird ein Fehler gemeldet, der keine Atomizitätseigenschaften garantiert
Das heißt: Redis-Transaktionen haben nur unter bestimmten Bedingungen eine bestimmte Atomizität
.
2.2 Isolation Die Isolation der Datenbank bezieht sich auf die Fähigkeit der Datenbank, mehreren gleichzeitigen Transaktionen das gleichzeitige Lesen, Schreiben und Ändern ihrer Daten zu ermöglichen. Durch die Isolation kann verhindert werden, dass mehrere Transaktionen gleichzeitig ausgeführt werden Ausführung führt zu Dateninkonsistenzen.
Die Transaktionsisolation ist in verschiedene Ebenen unterteilt:
read uncommitted
read commit
repeatable read
serializable
Zunächst muss klar sein: Redis hat nicht das Konzept der Transaktion Isolationsstufe. Hier diskutieren wir die Isolation von Redis:
In einem gleichzeitigen Szenario können Transaktionen eine gegenseitige Beeinträchtigung vermeiden
. Wir können die Transaktionsausführung in zwei Phasen unterteilen:
vor der Ausführung des EXEC-Befehls
und EXEC-Befehl nach der Ausführung und sie separat besprechen.
Vor der Ausführung des EXEC-BefehlsIm Abschnitt über Transaktionsprinzipien haben wir festgestellt, dass der Redis-Schlüssel noch geändert werden kann, bevor die Transaktion ausgeführt wird. Zu diesem Zeitpunkt können Sie den WATCH-Mechanismus
verwenden, um den Effekt einer optimistischen Sperre zu erzielen.
Nachdem der EXEC-Befehl ausgeführt wurdeDa Redis ein Single-Threaded-Ausführungsbefehl ist, stellt Redis nach der Ausführung des EXEC-Befehls sicher, dass alle Befehle in der Befehlswarteschlange ausgeführt werden. Dies stellt die Transaktionsisolation sicher.
2.3 HaltbarkeitDie Persistenz der Datenbank bedeutet: Nach Abschluss der Transaktion ist die Änderung der Daten dauerhaft und geht auch bei einem Systemausfall nicht verloren.
Ob Redis-Daten beibehalten werden, hängt vom Persistenzkonfigurationsmodus von Redis ab.
Ohne konfiguriertes RDB oder AOF kann die Haltbarkeit der Transaktion nicht garantiert werden.
Bei Verwendung des RDB-Modus gilt nach der Ausführung einer Transaktion und vor der Ausführung des nächsten RDB-Snapshots die Haltbarkeit der Transaktion, wenn ein Instanzabsturz auftritt Es gibt auch keine Garantie;
verwendet den AOF-Modus; die drei Konfigurationsoptionen des AOF-Modus, nein und jede Sekunde, führen zu Datenverlust. Die Dauerhaftigkeit von Transaktionen kann immer garantiert werden. Da die Leistung jedoch zu gering ist, wird die Verwendung in Produktionsumgebungen im Allgemeinen nicht empfohlen.
Zusammenfassend kann die Haltbarkeit von Redis-Transaktionen nicht garantiert werden
.
2.4 KonsistenzDas Konzept der Konsistenz war schon immer verwirrend. In den von mir gesuchten Informationen gibt es zwei verschiedene Definitionen.
wikipedia
Schauen wir uns zunächst die Definition von Konsistenz auf Wikipedia an:
Konsistenz stellt sicher, dass eine Transaktion möglich ist Bringen Sie die Datenbank nur von einem gültigen Zustand in einen anderen und behalten Sie dabei die Datenbankinvarianten bei: Alle in die Datenbank geschriebenen Daten müssen gemäß allen definierten Regeln, einschließlich Einschränkungen, Kaskaden, Triggern und jeder Kombination davon, gültig sein. Dies verhindert eine Beschädigung der Datenbank durch eine illegale Transaktion , garantiert aber nicht, dass eine Transaktion korrekt ist.
In diesem Text ist der Kern der Konsistenz „#🎜 🎜#Einschränkung#“ 🎜🎜#", "Alle in die Datenbank geschriebenen Daten müssen gemäß allen definierten Regeln gültig sein". Wie versteht man Einschränkungen? Hier ist ein Zitat aus der Zhihu-Frage
Wie man die interne und externe Konsistenz der Datenbank versteht
, beantwortet von Han Fusheng, einem OceanBase-Forschungs- und Entwicklungsexperten bei Ant Financial: # 🎜🎜#" „Einschränkungen“ werden vom Datenbankbenutzer der Datenbank mitgeteilt, dass der Benutzer verlangt, dass die Daten dieser oder jener Einschränkung entsprechen müssen. Wenn die Daten geändert werden, prüft die Datenbank, ob die Daten noch den Einschränkungen entsprechen. Wenn die Einschränkungen nicht mehr erfüllt sind, wird der Änderungsvorgang nicht durchgeführt.
Die beiden häufigsten Arten von Einschränkungen in relationalen Datenbanken sind „Eindeutige Einschränkungen“ und „Integritätsbeschränkungen“. Der in der Tabelle definierte Primärschlüssel und der eindeutige Schlüssel stellen sicher, dass die angegebenen Datenelemente niemals wiederholt werden. Die zwischen Tabellen definierte referenzielle Integrität gewährleistet auch die Konsistenz desselben Attributs in verschiedenen Tabellen. „Konsistenz in ACID“ ist so einfach zu verwenden, dass es den meisten Benutzern bewusst in den Sinn gekommen ist, die erforderlichen Einschränkungen beim Entwerfen von Tabellen hinzuzufügen.
Also
hängt die Konsistenz der Transaktion mit den vordefinierten Einschränkungen zusammen, sodass sichergestellt wird, dass die Einschränkungen die Konsistenz
gewährleisten.
Schauen wir uns diesen Satz genauer an: Dies verhindert eine Datenbankbeschädigung durch eine illegale Transaktion, garantiert aber nicht, dass eine Transaktion korrekt ist
.
Vielleicht sind alle immer noch etwas verwirrt, nachdem wir das geschrieben haben. Nehmen wir den klassischen Transfer
-Fall.
Wir starten eine Transaktion. Der Anfangssaldo auf den Konten von Zhang San und Li Si beträgt jeweils 1.000 Yuan, und es gibt keine Einschränkungen im Saldofeld. Zhang San überwies 1.200 Yuan an Li Si. Der Kontostand von Zhang San wird auf -200 aktualisiert und der Kontostand von Li Si wird auf 2200 aktualisiert.
Auf Anwendungsebene ist diese Transaktion offensichtlich illegal, da in realen Szenarien der Benutzersaldo nicht weniger als 0 sein darf, aber sie folgt vollständig den Einschränkungen der Datenbank, also auf Datenbankebene Die Transaktion ist weiterhin konsistent. Die Konsistenz ist gewährleistet. Die Transaktionskonsistenz von Redis bedeutet, dass die Redis-Transaktion während der Ausführung den Einschränkungen der Datenbank entspricht und keine illegalen oder ungültigen Fehlerdaten enthält. Wir diskutieren jeweils drei Ausnahmeszenarien: Vor der Ausführung des EXEC-Befehls ist der vom Client gesendete Operationsbefehl falsch, die Transaktion ist falsch beendet, und die Daten behalten ihre Konsistenz bei;
Nach der Ausführung des EXEC-Befehls stimmen der Datentyp des Befehls und der Operation nicht überein. Es wird ein Fehler gemeldet Befehl, aber die Transaktion wird aufgrund des falschen Befehls nicht abgebrochen, sondern weiter ausgeführt. Korrekte Befehle werden normal ausgeführt, und falsche Befehle melden Fehler. Aus dieser Perspektive können die Daten auch konsistent bleiben runter . Hier müssen Sie den Persistenzmodus der Dienstkonfiguration berücksichtigen.
Kein Persistenzspeichermodus: Nach dem Neustart des Dienstes behält die Datenbank keine Daten bei, sodass die Daten konsistent bleiben. RDB-/AOF-Modus: Nachher Der Dienst wird neu gestartet, Redis stellt Daten über RDB/AOF-Dateien wieder her und die Datenbank wird in einen konsistenten Zustand zurückversetzt.
Zusammenfassend:
Unter der Semantik, dass der Kern der Konsistenz die Einschränkung ist, können Redis-Transaktionen Konsistenz garantieren#🎜🎜 #.
"Designing Data-Intensive Applications"
Dieses Buch ist ein heiliges Buch für den Einstieg in verteilte Systeme. Im Transaktionskapitel gibt es eine Erklärung zu ACID:
Atomizität, Isolation und Haltbarkeit sind Eigenschaften der Datenbank, wohingegen Konsistenz ( im ACID-Sinne) ist eine Eigenschaft der Anwendung. Die Anwendung kann sich auf die Atomizitäts- und Isolationseigenschaften der Datenbank verlassen, um Konsistenz zu erreichen, aber es liegt nicht allein an der Datenbank. Daher gehört der Buchstabe C nicht wirklich zu ACID .
Atomizität, Isolation und Haltbarkeit sind Eigenschaften der Datenbank, während Konsistenz (im ACID-Sinn) eine Eigenschaft der Anwendung ist. Anwendungen können auf die Atomizitäts- und Isolationseigenschaften der Datenbank angewiesen sein, um Konsistenz zu erreichen, dies hängt jedoch nicht nur von der Datenbank ab. Daher gehört der Buchstabe C nicht zu ACID.
Oft bezieht sich die Konsistenz, mit der wir zu kämpfen haben, tatsächlich auf Konsistenz im Einklang mit der realen Welt
Konsistenz in der realen Welt ist das ultimative Ziel, das von Affären verfolgt wird.
Um Konsistenz in der realen Welt zu erreichen, müssen folgende Punkte erfüllt sein:
Garantie für Atomizität, Haltbarkeit und Isolation, dann kann die Konsistenz der Transaktion nicht garantiert werden.
Einschränkungen der Datenbank selbst, wie z. B. die Spaltenlänge oder Eindeutigkeitseinschränkungen dürfen nicht überschritten werden Ebene muss ebenfalls geschützt werden.
2.5 TransaktionsfunktionenWir bezeichnen Redis normalerweise als In-Memory-Datenbank. Um eine höhere Leistung und eine schnellere Schreibgeschwindigkeit zu gewährleisten, wurden einige Dinge auf der Design- und Implementierungsebene getan Ausgewogen, unterstützt transaktionales ACID nicht vollständig.
Redis-Transaktionen haben die folgenden Eigenschaften:
garantiert keine Haltbarkeit;
hat einen gewissen Grad an Atomizität, unterstützt aber kein Rollback; Konsistenz besteht darin, dass Redis-Transaktionen unter der Semantik von Einschränkungen Konsistenz gewährleisten können.
Aus technischer Sicht muss unter der Annahme, dass jeder Schritt in einem Transaktionsvorgang auf dem vom vorherigen Schritt zurückgegebenen Ergebnis basieren muss, eine optimistische Sperre durch Überwachung implementiert werden.
3 Lua-Skript
3.1 Einführung
Lua ist in Standard C geschrieben. Der Code ist einfach und schön und kann auf fast allen Betriebssystemen und Plattformen kompiliert und ausgeführt werden. Lua-Skripte können einfach über C/C++-Code aufgerufen werden und können wiederum C/C++-Funktionen aufrufen, wodurch Lua in Anwendungen weit verbreitet ist.
Lua-Skripte haben im Spielebereich glänzt. Sowohl das bekannte „Westward Journey II“ als auch „World of Warcraft“ nutzen Lua-Skripte ausgiebig. Lua-Skripte sind in API-Gateways zu sehen, mit denen Java-Backend-Ingenieure in Kontakt gekommen sind, wie zum Beispiel
Openresty und
Kong
.
Ab Redis Version 2.6.0 kann der integrierte Lua-Interpreter von Redis Lua-Skripte in Redis ausführen. Vorteile der Verwendung von Lua-Skripten:
Reduzieren Sie den Netzwerkaufwand. Senden Sie mehrere Anfragen gleichzeitig in Form eines Skripts, um die Netzwerklatenz zu reduzieren. Atomoperationen. Redis führt das gesamte Skript als Ganzes aus und es werden keine weiteren Befehle in die Mitte eingefügt. Wiederverwendung. Das vom Client gesendete Skript wird dauerhaft in Redis gespeichert, und andere Clients können dieses Skript wiederverwenden, ohne Code zur Vervollständigung derselben Logik verwenden zu müssen.
Das obige ist der detaillierte Inhalt vonLassen Sie uns über Transaktionen in Redis sprechen: Transaktionsmodus, Lua-Skript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn