diff --git a/backend/internal/handler/redis.go b/backend/internal/handler/redis.go index 4112ea6..f931b5e 100644 --- a/backend/internal/handler/redis.go +++ b/backend/internal/handler/redis.go @@ -3,6 +3,7 @@ package handler import ( "context" "fmt" + "net" "net/http" "strconv" "strings" @@ -393,10 +394,15 @@ func getRedisClient(instance *model.Instance, db int) (*redisClientWrapper, erro if len(slot.Nodes) == 0 { continue } - nodeAddr := slot.Nodes[0].Addr - if idx := strings.LastIndex(nodeAddr, ":"); idx >= 0 { - nodeAddr = instance.Host + nodeAddr[idx:] - } + nodeAddr := slot.Nodes[0].Addr + // 只在 Redis 上报空/回环地址时才用配置 host 兜底(NAT / 端口映射场景)。 + // 多机集群必须保留 Redis 上报的真实主机,否则会把跨机节点全部指向种子机, + // 导致 "dial tcp <种子机>:<其他机器的端口>: connection refused"。 + if h, p, err := net.SplitHostPort(nodeAddr); err == nil { + if h == "" || h == "127.0.0.1" || h == "0.0.0.0" { + nodeAddr = net.JoinHostPort(instance.Host, p) + } + } if !seen[nodeAddr] { seen[nodeAddr] = true addrs = append(addrs, nodeAddr)