日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

go 連接redis集群

作者:Json_Marz 更新時間: 2024-03-24 編程語言

最近用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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新