小编典典

Redis如何使EVAL脚本表现得像MULTI / EXEC?

redis

在使用Lua脚本时,我注意到的一件事是,在包含多个操作的脚本中,如果在脚本执行过程中抛出错误,则在错误之前完成的操作实际上会反映在数据库中。这与MULTI
/ EXEC相反,后者所有操作都成功或失败。

例如,如果我有如下脚本:

redis.call("hset", "mykey", "myfield", "val")
local expiry = someFunctionThatMightThrow()
redis.call("expire", "mykey", expiry)

我对此进行了测试,并且第一次hset调用的结果反映在redis中。是否有任何方法可以使lua脚本起作用,以便在脚本执行过程中引发任何错误,然后恢复该脚本执行过程中执行的所有操作?


阅读 373

收藏
2020-06-20

共1个答案

小编典典

我上面的评论的示例脚本,关于错误手动回滚。注意:语法未经验证。

redis.call("hset", "mykey", "myfield", "val")
local expiry,error = pcall(someFunctionThatMightThrow())
if expiry ~= nil then
  redis.call("expire", "mykey", expiry)
else
  redis.call("hdel", "mykey", "myfield")
end
2020-06-20