下载依赖:
go get -u github.com/go-redis/redis
文件代码:
package main import ( "context" "fmt" "log" "strings" "time" "github.com/go-redis/redis/v8" ) func main() { // Redis 集群节点 nodes := []string{ "localhost:7000", "localhost:7001", "localhost:7002", } // 或者使用域名去连接 // nodes := []string{ // "your-primary-node-domain:6379", // 替换为集群的主节点域名和端口 // "your-primary-node-domain2:6379", // // ... // } // 创建一个空的、非取消的上下文,用于传参给redis ctx := context.Background() // 创建 Redis 集群客户端 rdb := redis.NewClusterClient(&redis.ClusterOptions{ Addrs: nodes, //Addrs: []string{...}, // 超时 DialTimeout: 5 * time.Second, //连接建立超时时间,默认5秒 ReadTimeout: 5 * time.Second, //读超时时间,默认3秒,-1表示取消读超时 WriteTimeout: 5 * time.Second, //写超时时间,默认等于读超时 PoolTimeout: 5 * time.Second, //当所有连接都处在繁忙状态时,客户端等待可用连接的最大等待时长,默认读超时+1秒 // 闲置连接检查 IdleCheckFrequency: 60 * time.Second, //闲置连接检查的周期,默认为1分钟,-1表示不作周期性检查,只在客户端获取连接时对闲置连接进行处理 IdleTimeout: 5 * time.Minute, //闲置超时,默认5分钟,-1表示取消闲置超时检查 MaxConnAge: 0 * time.Second, //连接存活时长,从创建开始计时,超过指定时长则关闭连接,默认为0,即不关闭存活时长较长的连接 // 命令执行失败时的重试策略 MaxRetries: 0, //命令执行失败时,最多重试多少次,默认为0,即不重试 MinRetryBackoff: 8 * time.Millisecond, //每次计算重试间隔时间的下限,默认8毫秒,-1表示取消间隔 MaxRetryBackoff: 512 * time.Millisecond, //每次计算重试间隔时间的上限,默认512毫秒,-1表示取消间隔 }) // 测试连接 _, err := rdb.Ping(ctx).Result() if err != nil { log.Fatalf("Could not connect to Redis cluster: %v", err) } fmt.Println("Connected to Redis cluster!") // 创建一个map,用于存储客户端 IP 和连接数 clientCount := make(map[string]int) // redis 执行 ClientList 命令只能看到当前连接的节点上的客户端信息,无法查看集群所有的,所以需要先获取集群所有节点信息,再在每个节点上执行命令查看连接 // 只获取单个节点的客户端列表 clients, err := rdb.ClientList(ctx).Result() if err != nil { log.Printf("Could not get client list: %v", err) } // 解析客户端信息 for _, client := range strings.Split(clients, "\n") { if client == "" { continue } clientFields := strings.Split(client, " ") for _, part := range clientFields { if strings.HasPrefix(part, "addr=") { ip := strings.Split(part[5:], ":")[0] // 获取 IP 地址(去掉端口) //ip := part[5:] // 获取 IP 地址和端口 clientCount[ip]++ } } } // 获取集群所有节点的客户端列表信息 // 获取集群节点信息 // clusterNodes, err := rdb.ClusterNodes(ctx).Result() // if err != nil { // log.Fatalf("Could not get cluster nodes: %v", err) // } // //// 解析集群节点信息 // for _, nodeInfo := range strings.Split(clusterNodes, "\n") { // if nodeInfo == "" { // continue // } // // // 节点信息通常以空格分隔 // fields := strings.Fields(nodeInfo) // if len(fields) > 1 { // nodeAddr := fields[1] // 节点地址通常在第二个字段 // // // 获取该节点的客户端列表 // clients, err := rdb.ClientList(ctx).Result() // if err != nil { // log.Printf("Could not get client list from node %s: %v", nodeAddr, err) // continue // } // // // 解析客户端信息 // for _, client := range strings.Split(clients, "\n") { // if client == "" { // continue // } // clientFields := strings.Split(client, " ") // for _, part := range clientFields { // if strings.HasPrefix(part, "addr=") { // ip := strings.Split(part[5:], ":")[0] // 获取 IP 地址(去掉端口) // //ip := part[5:] // 获取 IP 地址和端口 // clientCount[ip]++ // } // } // } // } // } // 输出IP跟连接数信息 fmt.Println("Client IPs and connection counts:") for ip, count := range clientCount { fmt.Printf("IP: %s, Connections: %d\n", ip, count) } // 关闭客户端 defer rdb.Close() }
标签:parker,err,--,redis,节点,time,strings,客户端 From: https://www.cnblogs.com/Xinenhui/p/18489604