【问题标题】:In Redis, what happens when there is a MULTI with no associated EXEC or DISCARD?在 Redis 中,当 MULTI 没有关联的 EXEC 或 DISCARD 时会发生什么?
【发布时间】:2012-08-17 06:53:21
【问题描述】:

我有一系列在 Redis Set 之间移动元素的脚本。有时这些操作需要是原子的。有时一个脚本会失败,但其他脚本会继续工作。

我很好奇如果我在一个脚本中运行 MULTI 并启动但随后脚本以某种方式失败并且我从不调用 EXEC 或 DISCARD 会发生什么 - 我知道我的数据完整性很好,因为事务永远不会发生,但是因为命令在某处排队并且从未执行我担心如果这种情况经常发生(它不应该,但谁知道?)我需要清理队列?

【问题讨论】:

    标签: transactions redis


    【解决方案1】:

    取决于“脚本失败”的确切含义

    如果与redis服务器的连接丢失,则查询缓冲区将被释放。

    如果与 redis 服务器的连接仍然处于活动状态,并且您的代码的其他部分根本不使用它,那么查询缓冲区将继续占用服务器上的内存。默认情况下,空闲客户端连接不会终止。如果你在 redis.conf 中指定了timeout,查询缓冲区最终会被回收。

    如果与 redis 服务器的连接仍然处于活动状态,并且脚本中的另一个模块/函数/块重用了该连接,事情就会变得更有趣。他们执行的任何命令都将在服务器上排队,因为它们是前一个多块的一部分。如果此模块启动另一个 multi,redis 服务器将响应“(错误)ERR MULTI 调用不能嵌套”,但查询缓冲区不会被清除。您的应用程序的行为方式很大程度上取决于您使用的 redis 驱动程序。

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      相关资源
      最近更新 更多