【问题标题】:Implementing pipelining and transaction both to a redis cluster using go-redis package without WATCH使用 go-redis 包在没有 WATCH 的情况下实现流水线和事务到 redis 集群
【发布时间】:2017-04-24 12:50:37
【问题描述】:

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

【问题讨论】:

  • 使用Watch 方法有什么问题?如果你不喜欢这个 API,redigo 是另一个流行的包。

标签: go transactions redis pipelining


【解决方案1】:

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

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

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

清单如何显示是未知的,因为它取决于客户端库和它所做的任何检查,例如它如何在事务块期间处理重定向。

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

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2018-10-13
    • 2019-07-19
    • 2015-06-02
    • 2021-01-06
    • 2021-02-07
    • 2014-04-04
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多