首页 > 数据库 >Go--获取redis/parker集群的客户端列表信息

Go--获取redis/parker集群的客户端列表信息

时间:2024-10-21 15:45:56浏览次数:6  
标签:parker err -- redis 节点 time strings 客户端

下载依赖:

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

相关文章

  • 【数据结构】动态规划:揭开算法优化的秘密
    在算法世界中,动态规划(DynamicProgramming,DP)无疑是一个充满魅力的思想,特别是在解决复杂的优化问题时,它展现出了极大的威力。它不仅能优化问题的求解速度,还能通过减少重复计算来提高效率。然而,对于很多初学者来说,动态规划常常显得有些晦涩难懂。本文将通过浅显的例子,帮助你......
  • 20222425 2024-2025-1《网络与系统攻防技术》 实验二实验报告
    目录1.实验内容2.实验问题3.实验过程3.1windows下使用netcat获取kali的Shell,用cron命令启动某项任务3.1.1使用netcat获取kali的shell3.1.2用cron命令启动某项任务3.2kali下使用socat获取windows的Shell,用schtasks命令创建并启动某项任务计划3.2.1实验准备3.2.2......
  • 【OpenAI】第一节(OpenAI API)获取OpenAI API KEY的两种方式,开发者必看全方面教程!
    在当今人工智能迅猛发展的时代,OpenAI的大模型为开发者提供了强大的文本生成能力。无论你是想创建聊天机器人、内容生成工具,还是其他创新应用,掌握如何获取和使用OpenAIAPIKey是你迈向成功的第一步!本文将详细介绍获取APIKey的步骤、充值方法以及如何在项目中调用API......
  • 【论文阅读笔记】An Image is Worth 1/2 Tokens After Layer 2: Plug-and-Play Infere
    论文地址:https://arxiv.org/pdf/2403.06764代码地址:https://github.com/pkunlp-icler/FastV目录IntroductionInefficientVisualAttentioninVLLMsPreliminaries两种分数结果分析FastVOverviewRe-rankandFilteringmodule(core)ThoughtIntroduction现象(问题):大多数LVL......
  • 1200PLC通过NODERED,将数据发布到阿里云物联网平台
    配置要求:1,电脑上需要安装有博图软件,我这里使用的是TIAPortalV16版本2,电脑上需要安装NODE_RED3,已经有阿里云物联网平台账号。新建PLC项目,编写PLC程序,*新建PLC项目,我这里硬件为cpu1214,dcdc_R|||||----|----|----|||||设置......
  • 织梦数据库主表?dedecms数据库包含那些表
    以下是织梦CMS(DedeCMS)数据库表的汇总表格,包括主要表及其用途:表名用途dede_admin管理员信息表,存储管理员账号、密码、权限等信息。dede_addonarticle附加文章表,存储文章的详细内容。dede_arctype栏目类型表,存储网站栏目的分类信息。dede_archives文档主......
  • UI自动化测试方案及各个环境部署步骤
    Saas后台UI自动化测试方案一、背景saas后台功能繁多,人工回归工作量大;版本持续迭代周期快,无足够的人力资源进行全量回归测试,特别是后端架构变动时,影响范围很广,导致测试占用时间太多。二、目标目标一:对冒烟测试、主功能回归测试进行自动化,这样可以持续,快速的分析新需求加入,版......
  • 通义灵码操作指南——安装和登陆指南
    点击链接,立即下载通义灵码插件:https://tongyi.aliyun.com/lingma/兼容IDE和系统本文介绍通义灵码IDE插件兼容的IDE、操作系统等。JetBrainsIDEsIDE版本:IntelliJIDEA、PyCharm、GoLand、WebStorm、AndroidStudio等2020.3及以上操作系统:Windows7及以上、macOS、......
  • 通义灵码操作指南——插件使用指南
    点击链接,立即下载通义灵码插件:https://tongyi.aliyun.com/lingma/通义灵码,作为智能编码助手,可以在你进行编码工作时,为你提供行级/函数级实时续写、注释生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、代码问题修复等辅助编码工作的功能。说明:在IDE环......
  • 通义灵码操作指南——插件配置指南
    点击链接,立即下载通义灵码插件:https://tongyi.aliyun.com/lingma/通义灵码支持在VisualStudioCode、JetBrainsIDEs中修改常用快捷键、进行行间生成的启用/禁用等功能开关配置。VisualStudioCode中配置通义灵码准备工作如果需要在VisualStudioCode中使用通义灵码,必......