You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

go-redis v9.5.1在Redis集群模式下事务被拆分问题求助

Redis集群模式下go-redis事务拆分问题及疑问

我正在学习Redis,使用go-redis v9.5.1在Redis集群模式下尝试将多个操作封装为事务,遇到了事务被拆分的问题,具体情况如下:

案例1:TxPipeline包含带Hash Tag的Key与TIME命令

尝试将4个命令(Incr、两个Get、Time)放入事务:

ctx := context.Background()
pipe := s.c.TxPipeline()

// New token is added to the tail of the queue
pipe.Incr(ctx, s.tailKey(Id, Key))
pipe.Get(ctx, s.headKey(Id, Key))
pipe.Get(ctx, s.resetKey(Id, Key))
pipe.Time(ctx)

cmds, err := pipe.Exec(ctx)
if err != nil && !errors.Is(err, redis.Nil) {
    log.Error().Err(err).Msg("redis")
    return 0, 0, nil, err
}

通过Redis MONITOR命令调试发现,事务被拆分为两个MULTI-EXEC块:

1710299128.368998 [0 192.168.73.113:58490] "multi"
1710299128.369037 [0 192.168.73.113:58490] "incr" "{KEY}:tp"
1710299128.369046 [0 192.168.73.113:58490] "get" "{KEY}:hp"
1710299128.369050 [0 192.168.73.113:58490] "get" "{KEY}:rs"
1710299128.369054 [0 192.168.73.113:58490] "exec"
1710299128.369800 [0 192.168.73.113:58490] "multi"
1710299128.369810 [0 192.168.73.113:58490] "time"
1710299128.369812 [0 192.168.73.113:58490] "exec"

前三个命令操作的Key共享相同的Hash Tag {KEY},被放入同一个MULTI-EXEC块,而TIME命令单独成为一个块。

案例2:TxPipelined包含不同Hash Tag的Key

另一处使用TxPipelined的代码:

_, err = s.c.TxPipelined(ctx, func(p redis.Pipeliner) error {
    p.ZAddNX(ctx, s.queueKey(TEST, KEY), redis.Z{Member:t.ID, Score: timeToRedisScore(t.CreatedTime)})
    p.HSet(ctx, s.sessionKey(TEST, KEY, t.ID), t.ToHash())
    p.Expire(ctx, s.sessionKey(TEST, KEY, t.ID), s.TTL)
    return nil
})

同样被拆分为两个MULTI-EXEC块:

1710299128.370271 [0 192.168.73.113:58490] "multi"
1710299128.370297 [0 192.168.73.113:58490] "zadd" "KEY:q" "nx" "1710299128369" "c5c86e7d-ed3d-4e90-86da-18a4a15f4e1c"
1710299128.370307 [0 192.168.73.113:58490] "exec"

1710299128.370948 [0 192.168.73.113:58490] "multi"
1710299128.370979 [0 192.168.73.113:58490] "hset" "KEY:{c5c86e7d-ed3d-4e90-86da-18a4a15f4e1c}:sess" "GID" "TEST" "GRD" "LOGIN_QUEUE" "T" "c5c86e7d-ed3d-4e90-86da-18a4a15f4e1c" "1710299128369"
1710299128.371000 [0 192.168.73.113:58490] "expire" "KEY:{c5c86e7d-ed3d-4e90-86da-18a4a15f4e1c}:sess" "60"
1710299128.371008 [0 192.168.73.113:58490] "exec"

这里ZAddNX操作的Key无Hash Tag,而HSet和Expire操作的Key共享Hash Tag {c5c86e7d-ed3d-4e90-86da-18a4a15f4e1c},因此被拆分为两个独立的事务块。

疑问

  • 我观察到同一MULTI-EXEC块内的命令操作的Key都共享相同的Hash Tag,但查看go-redis客户端实现后未找到相关的Hash Tag处理逻辑,请问是否有人遇到过类似问题?
  • TIME命令不包含Key,它会被映射到哪个Key Slot?

望得到建议与帮助。

内容的提问来源于stack exchange,提问作者Whispererli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 04:57:35