当前位置: 首页 > 面试题库 >

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

颜昕
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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


 类似资料:
  • 我理解Lua脚本与watch/multi/exec相比相对较新。那么现在有没有理由使用watch/multi/exec呢?

  • 问题内容: 我想复制这里显示的示例: 包装布局 使用MiGLayout。我尝试了一些组合,但是随着容器的缩小,我很难将按钮自动包装到新行。 有人可以提供一个可行的例子吗? 这是程序的外壳: 问题答案: 根据MiGLayout的创建者和以下问题的答案: http://migcalendar.com/forums/viewtopic.php?f=8&t=3421 http://migcalendar.

  • 问题内容: 我正在做一些Android开发,并且我更喜欢Visual Studio,但是我必须为此使用 Eclipse 。 是否有人开发了可以使 Eclipse 外观和行为更像Visual Studio的工具?我主要不能忍受它 对应 如何编程的 clippyesqe 建议(是的,我知道我还没有使用该私有字段!感谢Eclipse!),或者它的糟糕的 intellisense 。 例如,在eclips

  • 主要内容:Redis 脚本,1.Eval 命令,2.EvalSha 命令,3.Script Exists 命令,4.Script Flush 命令,5.Script kill 命令,6.Script Load 命令Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。 1.Eval 命令 Redis Eval 命令使用 Lua 解释器执行脚本。 1.1语法 Eval 命令的基本语法如下: cript

  • 问题内容: 在Redis中,我通过CLI运行Lua脚本,如下所示:- 因此,我的Lua脚本接受4个键和2个参数。 现在,我想在Node.js中运行相同的脚本。 我正在使用此库在我的应用程序中导入Redis。 我没有找到任何有关执行Lua脚本的函数参数的示例。 因此,我只是碰到一些可能起作用的东西。但是似乎没有任何作用。 我的app.js像这样: 我的问题:如何使用node.js执行以下命令,以便它

  • 主要内容:第一个Lua脚本命令,为什么使用Lua脚本,常用脚本命令,基本命令应用从 Redis 2.6 版本开始,Redis 使用内置的 Lua 解释器执行脚本,这意味着我们可以直接在 Redis 客户端执行Lua 脚本 ,于此同时 Redis 还非常贴心地提供了用于编写 Lua 脚本的 命令。 第一个Lua脚本命令 Lua 是一种轻量小巧、开源的脚本语言,用标准 C语言编写。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它被广泛的应用于:游戏开发