在Redis中,当存在没有相关EXEC或DISCARD的MULTI时会发生什么?

时间:2012-08-21 21:13:23

标签: transactions redis

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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