我有一系列在Redis集之间移动元素的脚本。有时这些操作需要是原子的。有时一个脚本会失败,但其他脚本会继续工作。
我很好奇如果在一个脚本中我运行MULTI并启动然后脚本会以某种方式失败并且我从不调用EXEC或DISCARD将会发生什么 - 我知道我的数据完整性很好,因为事务永远不会发生,但是命令在某个地方排队,从不执行我担心如果这种情况经常发生(它不应该,但是谁知道?)我需要清理队列吗?
答案 0 :(得分:2)
取决于“脚本失败”的确切含义
如果与redis服务器的连接丢失,则将释放查询缓冲区。
如果与redis服务器的连接仍处于活动状态,并且代码的其他部分根本不使用它,则查询缓冲区将继续占用服务器上的内存。默认情况下,空闲客户端连接不会终止。如果您在redis.conf中指定了timeout
,则最终将回收查询缓冲区。
如果与redis服务器的连接仍处于活动状态,并且脚本中的另一个模块/功能/块重用了该连接,则事情会变得更加有趣。它们执行的任何命令都将在服务器上排队,因为它们是前一个多块的一部分。如果此模块启动另一个多,则redis服务器将响应“(错误)ERR MULTI调用无法嵌套”,但查询缓冲区未清除。您的应用程序的行为将在很大程度上取决于您使用的redis驱动程序。