我的需求是使用go实现连接到redis集群的流水线事务。我使用的是go-redis包,它支持redis集群,管道和transactions.How。我不使用go-redis包中的监视键来实现流水线事务。我还研究了实现事务时所需的package.Is监视关键字中的Tx.Pipeline()
发布于 2016-12-09 22:35:26
结合使用管道、事务(多/执行)和集群,您可能会遇到不满意的结果。在Redis集群中,您将与多个服务器对话。这在这里很重要,因为流水线和多/EXEC都是面向单节点的命令。
流水线本质上是将一堆命令排成队列,并将它们作为单个网络调用发送到服务器。如果您的命令需要转到不同的集群节点,这将不起作用,因为您不能使用单个网络发送来发送到多个节点。
类似地,MULTI只存在于它被发送到的节点内,而不存在于整个集群范围内。因此,如果您的命令在不同节点上的多个/exec访问键中,您将不会有可靠的事务。
这是如何显示的是未知的,因为它依赖于客户端库和它所做的任何检查,比如它如何在事务块期间处理重定向。
但是,最终,如果您绝对需要流水线多/exec,您将需要使用Redis的"hashtag“方法确保所有键都在一个节点上;使用客户端代码检查所有键的位置,如果不在同一节点上则会引发错误,同时还希望在检查和命令执行之间不移动键;或者不使用cluster。在前两种情况下,您将希望使用WATCH来指定要使用的键,从而使您有机会检测插槽更改以及检测不同节点的条件。
https://stackoverflow.com/questions/41053692
复制相似问题