Ще бъдете добре по отношение на атомността според документацията на Redis:
Redis използва същия интерпретатор на Lua за изпълнение на всички команди. Също така Redis гарантира, че скриптът се изпълнява атомарно:никой друг скрипт или команда Redis няма да бъде изпълнена, докато скриптът се изпълнява. Тази семантика е подобна на тази на MULTI / EXEC. От гледна точка на всички останали клиенти ефектите от скрипта или все още не са видими, или вече са завършени.
Въпреки това, ако скриптът е твърде бавен, това причинява проблем. Така че скриптът е най-добрият за леки операции, които изискват известна логика и атомарност.
Друга вратичка, в която може да попаднете, е, че ако скриптът се провали по някакъв начин в средата, тези извиквания, които сте направили, не могат да бъдат върнати назад, въпреки че скриптът ще върне грешка.
Например:Имате скрипт като този:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
Изпълнението на скрипта ще върне грешка, но foo
вече е зададен в redis като 1
.
Нещо, което не е свързано с вашия въпрос:Забелязах, че сте използвали
eval "your_raw_code" key_count keys argv
всъщност можете да извикате файла lua скрипт в eval, когато сте в терминала:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv