#3800·go-redis

当命令无法加入队列时, TxPipeline.Exec 发生超时

作者: howz97创建于 2026年4月30日更新于 2026年5月21日

问题跟踪器用于报告错误并讨论新特性. 请使用 [stackoverflow] (https://stackoverflow.com)用于支持问题.

TxPipeline (英语). 当命令无法排队时执行超时 。 我用去-Redis连接一个分布式的Redis集群,Redis集群要求交易的所有密钥必须位于同一个槽中,否则后续的命令不能被添加到交易队列中.

这是我的节目:

主软件包

导入( E)
内容
"fmt" (英语).

"GitHub.com/Redis/go-Redis/v9" (中文(简体) ).
(中文(简体) ).

func 主 () {
ctx:=上下文. 背景情况( )

客户端:=Redis. NewClient(和Redis). 选项{
添加:"当地主机:62908",
) (中文(简体) ).
推迟客户端。 关闭( C)

fmt.Println (“ 使用 TxPipeline... ”)
管:=客户端. TxPipeline () (英语).
如果错误:= 管道。 set(ctx,"a", 1, 0). Err (); 错误 != 无 {
fmt. (英语). Printf ("TxPipeline push 错误 :% v\n",错误)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
如果错误:= 管道。 set(ctx,"b",1,0). Err (); 错误 != 无 {
fmt. (英语). Printf ("TxPipeline push 错误 :% v\n",错误)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
cmders,错误:=管. 执行( ctx)
如果错误 ! = 无 {
fmt.Printf ("TxPipeline Exec 错误 :% v\n",错误)
 , cmder: = 范围 cmders {
如果Cmder的话。 错误( ) ! = 无 {
fmt.Printf ("cmd=%q m错误"v\n"), cmder. 字符串 (), cmder. 错误( )
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
否则
fmt. (英语). Println( “ TxPipeline 成功”)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

fmt.Println ("\n使用MULTI/EXEC...").
如果错误:=客户端。 do(ctx,"MULTI"). Err (); 错误 != 无 {
fmt. (英语). Printf (“ MULTI 错误 :% v\n”, 错误)
返回时
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
如果错误:=客户端。 set(ctx,"a", 1, 0). Err (); 错误 != 无 {
fmt. (英语). Printf (“ MULTI 推出错误 :% v\n”, 错误)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
如果错误:=客户端。 set(ctx,"b",1,0). Err (); 错误 != 无 {
fmt. (英语). Printf (“ MULTI 推出错误 :% v\n”, 错误)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
结果,错误:=客户端。 do(ctx,"EXEC"). 结果( )
如果错误 ! = 无 {
fmt.Printf ("MULTI EXEC"错误 :%v\n,错误)
否则
fmt. (英语). Printf ("MULTI EXEC 结果 :% v\n", 结果)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

产出是:

使用 TxPipeline...
TxPipeline Exec 错误:读取tcp 127.0.0.1:20204->127.0.0.1:62908:i/o超时
cmd=" set a 1: 读取tcp 127.0.0.1:20204->127.0.0.1:62908: i/o超时" 错误= read tcp 127.0.0.1:20204->127.0.0.1:62908:i/o超时" 错误=tcp 127.0.0:
cmd=" set b 1: 读取tcp 127.0.0.1:20204->127.0.0.1:62908: i/o超时" 错误= read tcp 127.0.0.1:20204->127.0.0.1:62908: i/o超时.

使用 MULTI/EXEC ...
MULTI 推出错误: 交易上下文中的 ERR, 密钥必须在同一位置
MULTI EXEC的结果: [好

□ 预期行为

TxPipeline (英语). Exec应报告与MULTI/EXEC相同的错误:"交易上下文中的ERR,密钥必须在同一槽".

□ 当前的行为

TxPipeline (英语). 执行超时

□ 可能的解决方案

<! -- -- 并非强制性的,但建议对错误进行修复/解释, >

□ 步骤重现

<! -- -- 提供一条与现场实例的链接,或一套明确的步骤来 -- -- > {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}再复制这个虫子! 如果相关,包含要复制的代码 -- >

  1. 联合国
  2. 联合国 3个 4.四.

□ 背景(环境)

{\fn华文仿宋\fs16\1cHD1D1D1} <! 这个问题对你有什么影响? 你想完成什么? -- -- " " ! -- -- 提供环境有助于我们找到在现实世界最有用的解决办法 -- -- "

<! -- 在上述标题中提供该问题的一般性摘要 . . . . . . .