最近再公司项目测试的遇到这个问题。记录解决过程
查看redis节点配置,显示redis节点配置正常。
使用工具连接redis集群也没问题
一般用redis工具连接写入数据正常就代表redis集群没什么问题
代码接口看是否设置了集群模式,添加一个支持集群的池go写的话需要设置goredis集群模式才可以连接,使用redisclent是连接不到集群的。
可以先写一份测试连接集群代码,连接没有问题再迁移到项目中。
参考代码如下
确保您的 Redis 客户端库正确配置了集群连接。使用 go-redis 时,需要创建一个集群客户端实例,如下所示:
import (
"github.com/go-redis/redis/v8"
"context"
)
func newRedisClusterClient() *redis.ClusterClient {
return redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{
"192.168.1.34:6379",
"192.168.1.34:6380",
"192.168.1.34:6381",
// 添加更多集群节点地址
},
})
}
func main() {
ctx := context.Background()
client := newRedisClusterClient()
// 测试连接
_, err := client.Ping(ctx).Result()
if err != nil {
log.Fatalf("Could not connect to Redis: %v", err)
}
log.Println("Connected to Redis cluster")
}
#使用 go-redsync 的示例代码
#如果您使用 go-redsync 进行分布式锁处理,请确保连接设置正确,并捕获可能的错误:
import (
"github.com/go-redsync/redsync/v4"
"github.com/go-redsync/redsync/v4/redis/goredis/v8"
"github.com/go-redis/redis/v8"
"context"
"log"
)
func newRedsync() *redsync.Redsync {
pool := goredis.NewPool(newRedisClusterClient())
return redsync.New(pool)
}
func main() {
ctx := context.Background()
rs := newRedsync()
m := rs.NewMutex("my-global-mutex")
if err := m.LockContext(ctx); err != nil {
log.Fatalf("Failed to acquire lock: %v", err)
}
log.Println("Lock acquired")
if ok, err := m.UnlockContext(ctx); !ok || err != nil {
log.Fatalf("Failed to release lock: %v", err)
}
log.Println("Lock released")
}
检查 actOnPoolsAsync 方法
从您的代码截图中可以看出,actOnPoolsAsync 方法用于在池中执行异步操作。确保所有池都正确初始化,并且没有网络或连接问题:
func (m *Mutex) actOnPoolsAsync(actFn func(redis.Pool) (bool, error)) (int, error) {
var (
taken []string
err error
ch = make(chan result, len(m.pools))
ctx = context.Background()
)
for _, pool := range m.pools {
go func(pool redis.Pool) {
status, e := actFn(pool)
ch <- result{statusOK: status, err: e, node: pool.Addr()}
}(pool)
}
for range m.pools {
r := <-ch
if r.statusOK {
taken = append(taken, r.node)
err = multierror.Append(err, nil)
} else {
err = multierror.Append(err, r.err)
}
}
return len(taken), err
}
#增加调试日志
#在代码中增加更多的日志记录,以便更好地了解错误发生的原因。例如:
if r.err != nil {
log.Printf("Error on node %s: %v", r.node, r.err)
}