網站首頁 編程語言 正文
最近用redis shake做redis數據遷移,由于redis提供的客戶端沒有用于查看集群的工具,且我部署的redis集群是基于k8s來構建的,沒有使用ingress做轉發,所以只能在k8s內部訪問集群,于是我先用go+gin框架編寫了訪問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 client
import (
"context"
"github.com/BurntSushi/toml"
"github.com/redis/go-redis/v9"
"net"
"redis-cluster-web/log"
)
type RedisClient struct {
*redis.Client
*redis.ClusterClient
}
type Conf struct {
RedisConf `toml:"redis"`
}
type RedisConf struct {
Addrs []string `toml:"addrs"`
Addr string `json:"addr"`
Database int `toml:"database"`
Password string `toml:"password"`
}
var RC RedisClient
func 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.Addr
r.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")
}
}
}
原文鏈接:https://blog.csdn.net/Json_Marz/article/details/129065346
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-08-26 Python中CSV文件(逗號分割)實戰操作指南_python
- 2022-11-05 Swift?Access?Control訪問控制與斷言詳細介紹_Swift
- 2022-09-07 Golang使用CGO與Plugin技術運行加載C動態庫_Golang
- 2022-06-24 python學習之讀取配置文件_python
- 2024-01-09 bigdecimal保留兩位小數
- 2022-07-22 CSS3:盒陰影、邊界圖片、指定每一個圓角、背景、過度、動畫、
- 2022-06-19 C語言簡明講解類型轉換的使用與作用_C 語言
- 2022-04-09 Nginx 提示10013: An attempt was made to access a soc
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支