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

Redis Lua-Skript, das CAS (Check-and-Set) implementiert?

Sie werden in Bezug auf die Atomizität gemäß der Redis-Dokumentation in Ordnung sein:

Redis verwendet denselben Lua-Interpreter, um alle Befehle auszuführen. Außerdem garantiert Redis, dass ein Skript atomar ausgeführt wird:kein anderes Skript oder kein Redis-Befehl wird ausgeführt, während ein Skript ausgeführt wird. Diese Semantik ähnelt der von MULTI / EXEC. Aus Sicht aller anderen Clients sind die Auswirkungen eines Skripts entweder noch nicht sichtbar oder bereits abgeschlossen.

Wenn das Skript jedoch zu langsam ist, verursacht es Probleme. Daher ist Skript das Beste für leichte Operationen, die etwas Logik und Atomarität erfordern.

Ein weiteres Schlupfloch, in das Sie geraten könnten, ist, wenn das Skript in der Mitte irgendwie fehlgeschlagen ist, diese Aufrufe, die Sie ausgeführt haben, nicht rückgängig gemacht werden können, obwohl das Skript einen Fehler zurückgibt.

Beispiel:Sie haben ein Skript wie dieses:

redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)

Die Skriptausführung gibt einen Fehler zurück, aber foo wurde bereits in redis als 1 gesetzt .

Etwas, das nichts mit Ihrer Frage zu tun hat:Mir ist aufgefallen, dass Sie

verwendet haben
eval "your_raw_code" key_count keys argv

Eigentlich könnten Sie die Lua-Skriptdatei in eval aufrufen, wenn Sie sich im Terminal befinden:

> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv