CLIENT 命令族是什么
CLIENT 是 Redis 的连接管理命令族:LIST 列出所有连接、INFO 看当前连接、KILL 踢掉指定连接、SETNAME 给连接贴名字、NO-EVICT 让当前连接豁免内存淘汰。排查「谁在连我、哪个客户端在拖慢实例」时几乎必用。6.2 起 KILL 统一为「过滤器」语法,旧式 CLIENT KILL ip:port 形式不利于精确匹配多个维度,新脚本应改用过滤形式。
基本信息
| 观察 | CLIENT LIST [TYPE normal|replica|pubsub|master] [ID id...] |
|---|---|
| 过滤维度 | ID / ADDR / LADDR / TYPE / USER / MAXAGE / SKIPME |
| 断开 | CLIENT KILL <过滤条件>;UNPAUSE 恢复被 CLIENT PAUSE 挂起的客户端 |
| 标签 | CLIENT SETNAME 名字 / CLIENT GETNAME,让连接在 LIST 里可辨识 |
| 版本 | NO-EVICT 为 7.0+;CLIENT INFO 为 7.2+ |
典型使用场景
- 定位连接泄漏:CLIENT LIST 里同一来源出现成百上千条连接,说明应用侧连接池配置或未关闭连接
- 踢掉失控客户端:某批处理任务挂了大量连接在跑重命令,按 ID 或 ADDR 精确断开
- 区分服务来源:为每个应用设置 CLIENT SETNAME,在 LIST 输出里一眼分辨是哪个服务占着连接
- 保护监控长连接:监控用长连接在内存满时被淘汰会误告警,用 CLIENT NO-EVICT ON 豁免
- 维护窗口清场:CLIENT PAUSE 挂起客户端后,用 KILL 清理残留长连接
常用操作
常用操作
# 先看清楚再动手,重点看 TYPE,别误杀复制连接
CLIENT LIST TYPE replica
CLIENT LIST
# 给连接贴标签,便于后续定位是哪个服务
CLIENT SETNAME app-worker-1
CLIENT GETNAME
# 按 ID 或地址精确断开一条连接
CLIENT KILL ID 42
CLIENT KILL ADDR 10.0.0.9:52344
# 批量踢普通连接(保留自己那一跳,谨慎使用)
CLIENT KILL TYPE normal SKIPME yes
# 让本条连接不被 maxmemory 淘汰(7.0+),监控长连接常用
CLIENT NO-EVICT ON
CLIENT INFOCLIENT LIST 关键列读法
| 列 | 含义 | 异常特征 |
|---|---|---|
| id | 连接自增编号 | KILL 时用 ID 最精确 |
| addr / laddr | 对端地址 / 本端地址 | 同一 addr 出现大量 id 即为连接泄漏 |
| name | CLIENT SETNAME 设的名字 | 名字为空说明调用方没做标签化,排障困难 |
| age | 连接已存活秒数 | 年龄极短且数量巨大说明客户端在反复重连 |
| idle | 空闲秒数 | idle 很大却占着连接,通常是连接池未回收 |
| cmd | 最近一次执行的命令 | 看到 keys 之类的重命令要追人 |
批量 KILL 前必须先 CLIENT LIST 确认目标:误杀 TYPE replica 会断开复制链路,误杀 pubsub 会让订阅方静默丢消息,误杀监控连接会触发误告警。
KILL 是异步生效的:命令返回时连接可能仍在关闭流程中,不要立刻断言端口已释放,用 CLIENT LIST 复查。