使用go-redis包实现流水线和事务到redis群集而不使用WATCH

时间:2016-12-09 05:30:42

标签: go transactions redis pipelining

我的要求是使用go实现连接到redis集群的流水线事务。我正在使用支持redis集群,管道和事务的go-redis软件包。如何在go-redis软件包中不使用WATCH密钥实现流水线事务。 我还查看了包中的Tx.Pipeline()。实现事务时需要WATCH键

1 个答案:

答案 0 :(得分:1)

使用管道,事务(MULTI / EXEC)和Cluster的组合可能会遇到不愉快的结果。在Redis Cluster中,您将与多个服务器通信。这在此很重要,因为流水线和MULTI / EXEC都是面向单节点的命令。

流水线操作本质上是将一堆命令排队并将它们作为单个网络调用发送到服务器。如果您的命令需要转到不同的群集节点,那么这将无法正常工作,因为您无法使用单个网络发送来发送到多个节点。

类似地,MULTI仅存在于发送到的节点内,而不是群集范围内。因此,如果您的命令位于不同节点上的multi / exec访问键中,则您将无法获得可靠的事务。

该清单的表示方式未知,因为它取决于客户端库及其所做的任何检查,例如它在事务块中如何处理重定向。

但是,最终,如果您绝对需要流水线式多/执行,则需要使用Redis的“hashtag”方法确保所有键都在一个节点上;使用客户端代码检查所有密钥的位置,如果不在同一节点上则引发错误,同时还希望在检查和命令执行之间没有移动密钥;或不使用集群。在前两种情况下,您将需要使用WATCH来指定要使用的密钥,从而使您有机会检测插槽更改以及检测不同节点条件。