Zgodnie z dokumentacją Redis, wszystko będzie w porządku pod względem atomowości:
Redis używa tego samego interpretera Lua do uruchamiania wszystkich poleceń. Redis gwarantuje również, że skrypt jest wykonywany w sposób niepodzielny:żaden inny skrypt ani polecenie Redis nie zostanie wykonane podczas wykonywania skryptu. Ta semantyka jest podobna do tej z MULTI / EXEC. Z punktu widzenia wszystkich innych klientów efekty działania skryptu są albo wciąż niewidoczne, albo już zakończone.
Jednakże, jeśli skrypt jest zbyt wolny, powoduje to problem. Skrypt jest więc najlepszy do lekkich operacji, które wymagają pewnej logiki i atomizacji.
Inną luką, w którą możesz wpaść, jest to, że jeśli skrypt w jakiś sposób zawiódł, wywołania, które wykonałeś, nie mogą zostać wycofane, chociaż skrypt zwróci błąd.
Np.:Masz taki skrypt:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
Wykonanie skryptu zwróci błąd, ale foo
został już ustawiony w redis jako 1
.
Coś niezwiązanego z Twoim pytaniem:zauważyłem, że użyłeś
eval "your_raw_code" key_count keys argv
właściwie możesz wywołać plik skryptu lua w eval, gdy jesteś w terminalu:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv