使用 go-redis 包在没有 WATCH 的情况下对 Redis 集群实现管道和事务

PLS*_*LSD 1 transactions go pipelining redis

我的要求是使用 go 实现连接到 redis 集群的管道事务。我正在使用支持 redis 集群、管道和事务的 go-redis 包。如何在不使用 go-redis 包中的 WATCH key 的情况下实现管道事务。我还查看了包中的 Tx.Pipeline() 。在实现事务时是否需要 WATCH key

The*_*ill 5

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

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

同样,MULTI 仅存在于其发送到的节点内,而不存在于集群范围内。因此,如果您的命令在不同节点上的 multi/exec 访问键中,您将不会获得可靠的事务。

具体如何体现尚不清楚,因为它取决于客户端库及其所做的任何检查,例如它如何在事务块期间处理重定向。

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