漯河市万金镇网站建设,国内免费crm,wordpress 摄影 主题,建设初级中学网站最近用redis shake做redis数据迁移#xff0c;由于redis提供的客户端没有用于查看集群的工具#xff0c;且我部署的redis集群是基于k8s来构建的#xff0c;没有使用ingress做转发#xff0c;所以只能在k8s内部访问集群#xff0c;于是我先用gogin框架编写了访问redis集群的…最近用redis shake做redis数据迁移由于redis提供的客户端没有用于查看集群的工具且我部署的redis集群是基于k8s来构建的没有使用ingress做转发所以只能在k8s内部访问集群于是我先用gogin框架编写了访问redis集群的代码然后打成镜像再部署到k8s中创建一个svc类型为NodePort方便外部访问。环境搭建完毕后访问接口发现连接redis集群失败报错dial tcp: lookup redis-cluster-v2-0.redis-cluster-v2.redis: i/o timeout我尝试在容器内部ping | telnet redis集群某一结点地址发现网络是可通的后面在代码中新增net.dail()去连接redis集群报另一个错误 got 4 elements in cluster info address, expected 2 or 3百度发现使用的go redis版本与redis的版本不一致造成的Redis 6.0及以下版本选择Go-redis v8.0及以下版本。Redis 7.0及以上版本选择Go-redis v9.0及以上版本。由于我部署的redis集群是7.0但go redis使用的版本是 v8[github.com/go-redis/redis/v8]于是修改go redis版本 github.com/redis/go-redis/v9重新部署一遍就可以了go redis cluster 代码package clientimport (contextgithub.com/BurntSushi/tomlgithub.com/redis/go-redis/v9netredis-cluster-web/log
)type RedisClient struct {*redis.Client*redis.ClusterClient
}type Conf struct {RedisConf toml:redis
}type RedisConf struct {Addrs []string toml:addrsAddr string json:addrDatabase int toml:databasePassword string toml:password
}var RC RedisClientfunc init() {RC.NewRedisClient()RC.NewRedisClusterClient()
}func (r *RedisClient) NewRedisClient() {conf : Conf{}_, err : toml.DecodeFile(redis.toml, conf)if err ! nil {log.Error.Println(read redis conf err:, err)return}redisAddr : conf.Addrr.Client redis.NewClient(redis.Options{Addr: redisAddr,Password: conf.Password,})
}
// 我把redis配置写在.toml的配置文件中
func (r *RedisClient) NewRedisClusterClient() {conf : Conf{}_, err : toml.DecodeFile(redis.toml, conf)if err ! nil {log.Error.Println(read redis conf err:, err)return}r.ClusterClient redis.NewClusterClient(redis.ClusterOptions{Addrs: conf.Addrs,})// 打印集群信息info : r.ClusterClient.ClusterInfo(context.Background())// 打印集群节点信息 nodes : r.ClusterClient.ClusterNodes(context.Background())log.Info.Println(info)log.Info.Println(nodes)// dial redis节点for _, addr : range conf.Addrs {_, err net.Dial(tcp, addr)if err ! nil {log.Error.Println(err)} else {log.Info.Println(dail , addr, success)}}
}