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

Wie man grundlegendes WATCH mit StackExchange.Redis durchführt

Der Grund WATCH nicht direkt verfügbar gemacht wird, liegt daran, wie SE.Redis entwickelt wurde, um Befehle aus verschiedenen Aufruflisten auf einer einzigen Verbindung zu multiplexen. Dies macht es erforderlich, dass jede Transaktionsarbeit sehr ist streng verwaltet.

Mir ist unklar, was der Zweck von "unverändert" an sich wäre , ohne Vergleich mit einem bekannten Wert - andernfalls schaffen Sie nur eine Race-Condition. Es wäre definitiv möglich, Unterstützung dafür hinzuzufügen, aber ich würde wirklich gerne zuerst den erwarteten Anwendungsfall verstehen. Können Sie das erklären?

Re deine Bearbeitung; Ihr bevorzugtes Beispiel (das letzte) ist mit redis einfach nicht möglich - nichts mit SE.Redis zu tun; wenn Sie ein GET ausführen innerhalb eines MULTI , erhalten Sie die Antwort erst mit EXEC vervollständigt - daher können Sie den Wert im SET unmöglich verwenden :ist noch nicht verfügbar .

Wenn es nicht um Multiplexing ginge, könnten Sie Ihr zweites Beispiel (basierend auf dem, was SE.Redis tut) ein wenig neu ordnen:

WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC

das ist das typische Verwendung von WATCH :Sie beobachten die Dinge, die Sie im Voraus abfragen, dann wissen Sie, dass {key} während dieser Schleife unverändert bleibt (oder zumindest die Transaktion abgebrochen wurde; kein inkonsistenter Zustand). Aber WATCH spielt nicht gut mit einem Multiplexer , weshalb SE.Redis Sie dazu zwingt, den Wert vor der Transaktion abzurufen , sodass Sie den Wert vergleichen können, um zu bestätigen, dass er unverändert ist. Gleiches Ergebnis; etwas anderer Ansatz, aber es ist Multiplexer-sicher. Weitere Informationen zu diesem Thema finden Sie hier.