首页 > 解决方案 > redis EVAL 真的是原子的并且是安全的吗?

问题描述

Redis doc 似乎确认 EVAL 脚本也类似于 MULTI/EXEC 事务。

用我个人的话来说,这意味着 LUA 脚本可以保证两件事:

(在第二点上,我对 MULTI/EXEC 没有这个顾虑,因为使用 MULTI/EXEC 你不能根据以前的命令进行写入)

(对不起基本的英语,我是法国人)

标签: redisluacrashevalatomic

解决方案


刚刚使用这个非常慢的脚本对其进行了测试:

eval "redis.call('set', 'hello', 10); for i = 1, 1000000000 do redis.call('set', 'test', i) end" 0

^ 这会将hello键设置为 10,然后将键无限设置test为数字。

执行脚本时,Redis 会记录以下警告:

# Lua slow script detected: still in execution after 5194 milliseconds. You can try killing the script using the SCRIPT KILL command. Script SHA1 is: ...

因此,我随后测试了在脚本执行时完全关闭容器以模拟崩溃。

重启后,hellotest键为nil,表示调用的命令都没有实际执行。因此,正如文档所述,脚本确实是原子的并且是安全的。

我的信念是 Redis 将 Lua 脚本包装在 aMULTI/EXEC中以使其具有原子性,或者至少具有相同的效果。


推荐阅读