Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis:Race Condition und Singlethread

Wenn Redis Single-Threaded ist, warum braucht man dann überhaupt einen Sperrmechanismus.

Redis ist in der Tat (meistens) Single-Threaded, aber das Sperren ist erforderlich, wenn mehrere Clients versuchen, in benachbarter zeitlicher Nähe unterschiedliche Dinge zu tun. Bei der in RiA diskutierten Sperrung geht es genau darum – sicherzustellen, dass nur ein Client/Thread eine bestimmte Aufgabe erledigt, oder sicherzustellen, dass Aktualisierungen nicht schief gehen.

Hier ist ein Beispiel, warum Sie trotz Redis Single-Threading eine Sperre benötigen würden:Angenommen, Sie haben einen Wert in Redis, eine Zahl, die beispielsweise unter einem Schlüssel namens foo gespeichert ist . Der Code Ihrer App liest diese Zahl (GET foo ), tut etwas (z. B. fügt 1 hinzu) und schreibt es zurück (SET ). Wenn Sie Ihren Code in einem einzelnen Thread ausführen, würde er so aussehen:

App               Redis
 |---- GET foo ---->|
 |<------ 1 --------|
 |                  |
 | thinking...      |
 |                  |
 |--- SET foo 2 --->|
 |<----- OK --------|

Sehen wir uns nun an, was passiert, wenn zwei App-Clients versuchen, dies zu tun:

App 1             Redis              App 2
 |---- GET foo ---->|                  |
 |<------ 1 --------|<--- GET foo -----|
 |                  |------- 1 ------->|
 | thinking...      |                  |
 |                  |       thinking...|
 |--- SET foo 2 --->|                  |
 |<----- OK --------|<--- SET foo 2 ---|
 |                  |------ OK ------->|

Hier können Sie sofort sehen, was ohne Sperren passiert ist, obwohl der Server (meistens) Single-Threaded ist - statt 3, foo Der Wert von ist 2. Wenn Sie mehr Threads/Clients/Apps hinzufügen, können die Dinge fröhlich und schrecklich schief gehen, wenn mehrere Autoren versuchen, die Daten ohne Koordination zu ändern (z. B. zu sperren).

Optimistisches Sperren ist nur eine der Möglichkeiten, die Redis über WATCH integriert anbietet Mechanismus. Manchmal ist Optimismus jedoch – trotz seiner lockeren und fröhlichen Natur – nicht die richtige Lösung, sodass Sie bessere/fortschrittlichere/andere Mechanismen implementieren müssen, um Rennbedingungen zu verhindern. Solche Sperren könnten wohl auch außerhalb von Redis implementiert werden, aber wenn Sie es bereits verwenden, ist es sinnvoll, Ihre Sperren auch darin zu verwalten.