Podle Redisovy dokumentace budete z hlediska atomičnosti v pořádku:
Redis používá ke spuštění všech příkazů stejný interpret Lua. Redis také zaručuje, že skript je spouštěn atomickým způsobem:během provádění skriptu nebude spuštěn žádný jiný skript nebo příkaz Redis. Tato sémantika je podobná sémantice MULTI / EXEC. Z pohledu všech ostatních klientů efekty skriptu buď stále nejsou viditelné, nebo jsou již dokončeny.
Pokud je však skript příliš pomalý, způsobuje problémy. Skript je tedy nejlepší pro lehké operace, které vyžadují určitou logiku a atomicitu.
Další mezerou, do které se můžete dostat, je to, že pokud skript uprostřed nějak selhal, tato volání, která jste provedli, nelze vrátit zpět, ačkoli skript vrátí chybu.
Např.:Máte skript jako tento:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
Spuštění skriptu vrátí chybu, ale foo
již byl v redis nastaven jako 1
.
Něco, co nesouvisí s vaší otázkou:Všiml jsem si, že jste použili
eval "your_raw_code" key_count keys argv
ve skutečnosti byste mohli volat soubor skriptu lua v eval, když jste v terminálu:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv