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.