Você ficará bem em termos de atomicidade de acordo com a documentação do Redis:
O Redis usa o mesmo interpretador Lua para executar todos os comandos. Além disso, o Redis garante que um script seja executado de maneira atômica:nenhum outro script ou comando Redis será executado enquanto um script estiver sendo executado. Esta semântica é semelhante à de MULTI/EXEC. Do ponto de vista de todos os outros clientes, os efeitos de um script ainda não são visíveis ou já estão concluídos.
No entanto, se o script for muito lento, causará problemas. Portanto, o script é o melhor para operações leves que exigem alguma lógica e atomicidade.
Outra brecha na qual você pode cair é que, se o script de alguma forma falhar no meio, as chamadas que você fez não poderão ser revertidas, embora o script retorne um erro.
Ex:Você tem um script assim:
redis.call('set', 'foo', 1)
redis.call('rpush', 'foo', 2)
A execução do script retornará um erro, mas
foo
já foi definido no redis como 1
. Algo não relacionado à sua pergunta:notei que você usou
eval "your_raw_code" key_count keys argv
na verdade, você pode chamar o arquivo de script lua em eval quando estiver no terminal:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv