1

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

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

4

1 回答 1

5

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

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

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

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

于 2012-08-22T04:29:31.927 回答