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
相关产品推荐
相关产品推荐

