Redis CLIENT INFO 怎样读取当前连接的数据库与网络地址
排查 Redis 连接时,经常会遇到两个看似简单的问题:这条连接当前选中了哪个逻辑库?它究竟从哪个客户端地址连进来?直接执行 CLIENT INFO 就能回答这两个问题。它返回的是发出这条命令的当前客户端,其中 db 是当前数据库编号,addr 是客户端地址,laddr 是 Redis 接收这条连接时使用的本地地址。
官方文档:https://redis.io/docs/latest/commands/client-info/
本文只讨论当前连接的字段读取,不把它扩展成全实例连接治理。要查看所有客户端,才考虑 CLIENT LIST。
前置条件:先把“当前连接”限定清楚
CLIENT INFO 从 Redis 6.2.0 开始提供,复杂度为 O(1),返回格式与 CLIENT LIST 的单条客户端信息一致,但内容只属于当前客户端。因此,同一个 Redis 实例上,不同连接执行这条命令,看到的 db、addr 和 name 可能不同。
这里有三个字段最值得先记住:
| 字段 | 含义 | 排查时看什么 |
|---|---|---|
db | 当前连接选中的逻辑数据库编号 | 确认命令是否落在预期的 DB |
addr | 客户端的地址和端口 | 识别是哪台应用或代理建立了连接 |
laddr | Redis 侧接收连接的本地地址和端口 | 判断连接命中了哪个监听地址 |
Redis 的逻辑库状态属于连接本身。新连接默认使用数据库 0;如果连接执行过 SELECT 3,随后读取到的 db 就应当是 3。重连后客户端需要重新选择数据库,不能把旧连接的状态当成新连接的状态。
用 redis-cli 读取 db 与网络地址
先让 redis-cli 在目标逻辑库上建立连接,再执行 CLIENT INFO。下面的 -n 3 只影响这一次 CLI 连接,不会修改其他客户端。
# 让这条 CLI 连接先进入逻辑库 3,再读取它自己的连接信息 redis-cli -h 127.0.0.1 -p 6379 -n 3 CLIENT INFO
返回结果通常是一行以空格分隔的 key=value 字段。示例中只保留与本文有关的字段,实际 Redis 还可能返回客户端 ID、空闲时间、协议版本和客户端库信息:
id=17 addr=192.0.2.24:48152 laddr=192.0.2.10:6379 db=3 name=worker-a
读这行结果时按下面的顺序判断:
db=3表示当前这条连接正在使用逻辑库 3,不代表实例只有 3 个库。addr=192.0.2.24:48152是 Redis 看到的客户端端点;经过 NAT 或代理时,它可能不是应用进程的真实内网地址。laddr=192.0.2.10:6379是 Redis 这一侧被连接的本地端点,可用于判断多网卡或多监听地址场景。

在 Go 程序中解析关键字段
程序化读取时不要按字段位置切片,因为 Redis 后续可能增加新的 key=value 字段。更稳妥的方式是按空白拆分,再按键名提取目标值;未知字段直接跳过。
package main
import (
"context"
"fmt"
"strconv"
"strings"
"github.com/redis/go-redis/v9"
)
// ClientFields 只保留排查当前连接所需的字段。
type ClientFields struct {
ID int64
Addr string
LAddr string
DB int
}
// parseClientInfo 按 key=value 解析,忽略 Redis 新增的未知字段。
func parseClientInfo(raw string) (ClientFields, error) {
var info ClientFields
for _, token := range strings.Fields(raw) {
key, value, ok := strings.Cut(token, "=")
if !ok {
continue
}
switch key {
case "id":
id, err := strconv.ParseInt(value, 10, 64)
if err != nil {
return info, fmt.Errorf("解析 id 失败: %w", err)
}
info.ID = id
case "addr":
info.Addr = value
case "laddr":
info.LAddr = value
case "db":
db, err := strconv.Atoi(value)
if err != nil {
return info, fmt.Errorf("解析 db 失败: %w", err)
}
info.DB = db
}
}
return info, nil
}
func main() {
ctx := context.Background()
// DB=3 让这条连接从逻辑库 3 开始,连接池重建时也会重新应用它。
client := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379", DB: 3})
defer client.Close() // 示例结束时释放连接池资源。
raw, err := client.Do(ctx, "CLIENT", "INFO").Text()
if err != nil {
panic(fmt.Errorf("读取 CLIENT INFO 失败: %w", err))
}
info, err := parseClientInfo(raw)
if err != nil {
panic(err)
}
fmt.Printf("db=%d addr=%s laddr=%s id=%d\n", info.DB, info.Addr, info.LAddr, info.ID)
}
这个示例的关键点有两个:一是命令通过同一个客户端连接发出,所以 db 对应的正是该连接;二是解析器只依赖字段名,不依赖返回字段顺序。生产代码可以把 panic 换成日志或上层错误返回,并对空地址、负数据库编号做业务级处理。

看到结果后怎样判断
如果你只想确认当前连接是否进了正确的逻辑库,优先看 db;如果要定位来源客户端,看 addr,同时结合应用连接池或代理日志;如果 Redis 有多个监听地址,则把 laddr 作为服务端接入点来对照。
不要用 CLIENT INFO 推断全实例连接数量。它只返回当前客户端;全量连接、按类型筛选或按客户端 ID 查询属于 CLIENT LIST 的范围。也不要把 addr 当成稳定的应用身份:端口通常是临时端口,代理、NAT 和容器网络都会改变可见地址。
另一个常见边界是 Redis Cluster。官方文档说明 Cluster 只支持数据库 0,不能依赖 SELECT 切换多库;这时 db=0 是正常结果,业务隔离应通过 key 命名或集群设计完成。
常见误区与总结
- 把 db 当实例配置:它描述的是当前连接状态,换连接或重连后要重新确认。
- 按固定位置解析:返回字段可能扩展,应按键名提取并忽略未知字段。
- 把 addr 当真实主机:它是 Redis 侧看到的端点,经过代理时只能作为连接线索。
- 拿 CLIENT INFO 做全量巡检:当前连接诊断与全实例连接列表是两个不同问题。
最小结论可以记成一句话:CLIENT INFO 看当前连接,db 看它选中的逻辑库,addr 看客户端端点,laddr 看 Redis 本地接入端点;需要全部客户端时再切换到 CLIENT LIST。
相关问题
CLIENT INFO 和 CLIENT LIST 有什么区别?
CLIENT INFO 只返回发出命令的当前客户端;CLIENT LIST 返回连接列表,并支持按类型或客户端 ID 过滤。
为什么重连后 db 又变成 0?
数据库选择属于连接状态,新连接默认使用数据库 0。连接池重建连接时,要在客户端配置中设置目标 DB,或在连接建立后重新执行选择逻辑。
addr 能直接对应到业务机器吗?
不一定。没有代理和地址转换时通常有帮助;存在 NAT、Sidecar 或代理时,它更适合作为 Redis 侧看到的网络线索。
MySQL 分区裁剪失效时的执行计划排查
- 上一篇
- MySQL 分区裁剪失效时的执行计划排查
- 下一篇
- Redis HyperLogLog 合并多个日活集合的计数方法
-
- 数据库 · Redis | 17分钟前 | redis RedisJSON JSONPath JSON.NUMINCRBY 嵌套数值
- Redis JSON.NUMINCRBY 怎样增量修改嵌套数值
- 411浏览 收藏
-
- 数据库 · Redis | 25分钟前 | Redis · redis XREADGROUP XACK XPENDING XAUTOCLAIM
- Redis XREADGROUP 消费确认与重试的处理方案
- 267浏览 收藏
-
- 数据库 · Redis | 27分钟前 | redis hyperloglog PFCOUNT PFMERGE 日活统计
- Redis HyperLogLog 合并多个日活集合的计数方法
- 302浏览 收藏
-
- 数据库 · Redis | 1天前 | Redis · 慢查询 · 日志管理 · 性能排查 · redis slowlog 慢日志 SLOWLOG GET SLOWLOG LEN slowlog-max-len
- Redis SLOWLOG 怎样读取并控制记录数量
- 219浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1011次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1015次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1141次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1112次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 957次使用
-
- Redis Stream XTRIM 如何避免消费组积压无限增长
- 2026-09-12 501浏览
-
- Redis AOF rewrite 期间如何判断磁盘与内存压力
- 2026-09-12 501浏览
-
- Redis RDB 和 AOF 怎么按可接受数据丢失量选择
- 2026-09-08 501浏览
-
- Redis XAUTOCLAIM 之后为什么仍有 pending:JUSTID、PEL 与消息删除边界
- 2026-08-29 501浏览
-
- Redis SET 的 GET 与 KEEPTTL 怎么一起验收:旧值返回、续期与回滚边界
- 2026-08-20 501浏览

