Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Script Redis Lua implementando CAS (check-and-set)?


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