【问题标题】:Is there any reason to use multi/watch/exec instead of Lua script (eval) in Redis?有什么理由在 Redis 中使用 multi/watch/exec 而不是 Lua 脚本(eval)?
【发布时间】:2021-04-01 21:08:44
【问题描述】:

我是 Redis 新手,这就是我的看法:

在我看来,watch/multi/exec 是一种实现乐观事务的相当尴尬的方式。 watch 和 exec 之间的持续时间可能很长,通常会持续几次往返才能完成(客户端需要向 Redis 服务器发送多个命令)。

另一方面,Lua 脚本支持更强大的事务(回滚、复杂条件检查...),并且不需要多次往返即可完成(全部在一个命令中)。而且它更直接。

我了解 Lua 脚本与 watch/multi/exec 相比相对较新。那么现在有什么理由使用 watch/multi/exec 吗?

【问题讨论】:

    标签: redis transactions


    【解决方案1】:

    如果您可以在一个简短的 Lua 脚本中完成所有操作,那可能是最有效的方法。 但是,如果您的事务可能很长或需要访问外部资源才能完成,您应该避免使用 Lua,尤其是因为 Lua 脚本执行会阻止 Redis 服务器进行并行调用。

    【讨论】:

    • 访问外部资源的需要似乎是一个有效的观点。但对于长事务,我想 MULTI/EXEC 也会阻塞 Redis。
    • 在 MULTI/EXEC 中,服务器只在 EXEC 阶段被阻塞,而不是在事务期间
    【解决方案2】:

    任何事情都有利有弊。

    为什么使用 MULTI/EXEC(主要原因):

    • 简单的动词(如果您已经熟悉 Redis),无需“学习” Lua(尽管只需 15 分钟即可完成)
    • 在服务器处理中,无需启动 Lua 上下文(虽然这样做的代价很小)
    • 确保块的原子性

    一旦您需要在事务中读取数据(即使用 WATCH),为了方便起见,我会立即使用 Lua。当然,长时间运行的事务或 Lua 脚本会阻塞服务器,因此请尽量避免这些。虽然在 MULTI/EXEC 的上下文中这样做比较困难,但 Lua 中的无限循环可以用一行来完成:)

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 2020-08-25
      • 2013-12-22
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2022-01-15
      相关资源
      最近更新 更多