根据Redis的文档,您在原子性方面会没事的:
Redis使用相同的Lua解释器来运行所有命令。另外,Redis保证以原子方式执行脚本:执行脚本时不会执行其他脚本或Redis命令。这种语义类似于MULTI
/ EXEC中的一种。从所有其他客户端的角度来看,脚本的效果还是不可见或已经完成。
但是,如果脚本太慢,则会导致问题。因此,脚本是需要某些逻辑和原子性的轻型操作的最佳选择。
您可能会遇到的另一个漏洞是,如果脚本在中间某种程度上失败了,尽管脚本将返回错误,但您所做的那些调用将无法回滚。
例如:您有一个如下脚本:
redis.call('set', 'foo', 1)redis.call('rpush', 'foo', 2)脚本执行将返回错误,但
foo已在Redis中设置为
1。
与您的问题无关的事情:我注意到您使用了
eval "your_raw_pre" key_count keys argv
实际上,当您在终端中时,可以在eval中调用lua脚本文件:
> redis-cli eval "$(cat path/to/script/script_name.lua)" key_count keys argv



