Redis 的 CLIENT KILL 命令用于在服务端主动断开一个或多个客户端连接。很多故障处理手册都会提到它,但真正执行时,不少人会遇到命令返回 OK,目标客户端却还在,或者自己管理连接被一并断开。理解这个命令的关键在于:它只负责关闭 TCP 连接,不会回滚已执行命令,也不会阻止客户端立即重连。本文从语法演变、参数组合、实际场景和误区四个维度讲清这个命令。

CLIENT KILL 语法与过滤条件
Redis 的 CLIENT KILL 命令有两个阶段语法。早期版本只支持 CLIENT KILL ip:port,例如 CLIENT KILL 127.0.0.1:52345。这个写法虽然很多老资料还在用,但已经被 Redis 官方标记为 deprecated,未来版本可能移除。它的限制是必须精确匹配 CLIENT LIST 中显示的 addr 字段,IPv6 地址因为包含冒号,用这种旧写法非常容易出错。
新版语法采用过滤条件组合,形式为 CLIENT KILL [过滤条件 ...]。Redis 会同时满足所有条件才断开连接,如果一次给出多个条件,它们之间是逻辑与的关系。常用过滤条件如下表。
| 条件 | 说明 |
|---|---|
| ADDR ip:port | 精确匹配客户端地址,等价于旧语法 |
| ID client-id | 按客户端 ID 断开,推荐优先使用 |
| TYPE type | normal、master、replica、pubsub 中的一种 |
| USER username | 仅杀死指定 ACL 用户下的连接,Redis 6 及以上可用 |
| LADDR ip:port | 匹配客户端连接到的本地 Redis 地址 |
| MAXAGE seconds | 断开空闲时间大于等于该秒数的连接 |
| SKIPME yes/no | 是否跳过执行 CLIENT KILL 的当前连接,默认 yes |
实际执行时,建议先用 CLIENT LIST 拿到目标连接信息,再根据 id、addr、age 或 idle 等字段决定怎么杀。盲目使用 MAXAGE 0 或者不带条件的新语法可能造成预期之外的断开。
# 查看当前所有客户端连接 127.0.0.1:6379> CLIENT LIST id=11 addr=127.0.0.1:52345 laddr=127.0.0.1:6379 fd=8 name= age=10 idle=6 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=40928 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client|list user=default redir=-1 resp=2 # 按 ID 精准断开 127.0.0.1:6379> CLIENT KILL ID 11 OK # 按地址断开(新语法) 127.0.0.1:6379> CLIENT KILL ADDR 127.0.0.1:52345 OK
上面的 CLIENT LIST 输出里,idle 表示连接已空闲秒数,age 表示连接已存在秒数,cmd=client|list 是最后执行的命令。通过这些字段可以判断哪些连接是真正的空闲连接,哪些正在执行命令。
CLIENT KILL 典型使用场景
第一种场景是清理长时间空闲连接。Redis 的 maxclients 参数限制同时连接的客户端数量,当某些客户端建立连接后既不发送命令,也不关闭,会持续占用文件描述符和少量内存。此时可以设置 CLIENT KILL MAXAGE 300 断开空闲超过 5 分钟的连接。注意 MAXAGE 的单位是秒,且判断依据是 Redis 记录的最近一次命令时间,不是系统层面的 TCP 活跃时间。
第二种场景是安全事件中的应急隔离。如果发现某个来源 IP 或某个 ACL 用户发起大量异常请求,可以先通过 CLIENT KILL ADDR 203.0.113.10:任意端口 组合 USER 条件,或者直接 CLIENT KILL USER attacker 将该用户所有连接断开。这里需要 Redis 6 以上版本支持 ACL,并且连接是通过带用户名认证建立的。若客户端使用默认 default 用户,USER default 会匹配大部分普通连接,需要格外谨慎。
第三种场景是版本升级或维护前的主动断流。在执行重启或切换前,如果业务客户端没有优雅退出机制,可以用 TYPE normal 批量断开普通业务连接,让客户端感知到连接中断并触发重连或告警。这个操作可以配合 CLIENT PAUSE 使用:先暂停所有客户端请求,再处理连接,最后恢复。不过 CLIENT PAUSE 只是停止处理命令,不会关闭 TCP 连接,与 CLIENT KILL 有本质区别。
# 维护前先暂停 10 秒,给上游切换留出时间 127.0.0.1:6379> CLIENT PAUSE 10000 OK # 断开所有普通业务连接,跳过当前管理连接 127.0.0.1:6379> CLIENT KILL TYPE normal OK # 恢复请求 127.0.0.1:6379> CLIENT UNPAUSE OK
上面的组合操作在数据库代理、连接池滚动发布等场景很实用。但要注意 CLIENT KILL TYPE normal 不会断开 master、replica 和 pubsub 类型连接,因此不会影响主从复制链路。
常见误区与避坑建议
误区一:认为 CLIENT KILL 可以撤销或回滚客户端已经发送的命令。Redis 服务端单线程处理命令,如果某个命令正在执行,CLIENT KILL 不会中断它;只有在命令处理完成后,Redis 才会发现该客户端被标记为需要关闭,然后断开连接。因此对已经执行的写命令,CLIENT KILL 起不到回滚作用。客户端还可能在断开后自动重连并继续重试,这也解释了为什么有时看到连接没有减少。
误区二:误用 MAXAGE 0。很多教程写 CLIENT KILL MAXAGE 0 表示立即断开所有客户端,这在部分版本中确实成立,因为空闲时间大于等于 0 的客户端包括所有连接。但如果 Redis 版本行为有差异,或者命令执行时增加了 SKIPME no,会把自己也杀掉。更危险的是,如果此时主从复制使用 Redis 服务端主动建立的连接,MAXAGE 0 可能误伤 replica 连接。实际工作中建议不要依赖 MAXAGE 0 做模糊清理,而应指定具体 ID 或 ADDR。
误区三:混淆 CLIENT KILL 与 CLIENT PAUSE。前者是真正关闭 TCP 连接,客户端会收到连接被对端关闭的错误;后者只是让 Redis 停止处理命令,连接保持存活,客户端发送的命令会在缓冲区等待。两者虽然都在故障处理中出现,但动作和影响完全不同。想临时停止写入、给主从切换留窗口,应该用 CLIENT PAUSE;想强制断开异常客户端,才用 CLIENT KILL。
误区四:误杀主从复制连接。Redis 从节点会以 TYPE replica 的身份连到主节点,断掉这个连接会导致复制中断,需要从节点重新发起部分重同步或全量同步。如果全量同步数据量很大,可能造成主库短时 CPU、内存和网络压力升高。因此执行批量 KILL 时,应优先使用 TYPE normal 而不是不带 TYPE 的条件,或明确排除 replica。
# 错误示例:可能误杀所有类型连接 127.0.0.1:6379> CLIENT KILL MAXAGE 0 # 更稳妥的写法:只处理普通业务连接 127.0.0.1:6379> CLIENT KILL TYPE normal OK # 确认主从连接没有被误杀 127.0.0.1:6379> CLIENT LIST TYPE replica id=5 addr=172.16.0.10:51520 laddr=172.16.0.5:6379 fd=9 name= age=86400 idle=1 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=2048 events=r cmd=replconf user=default redir=-1 resp=2
误区五:忽略 SKIPME 的默认行为。执行 CLIENT KILL 的那条连接本身就是 Redis 的一个客户端,默认 SKIPME yes 会跳过它,这是合理设计。但如果你通过脚本批量执行,某些包装工具或代理可能以一个长连接身份执行命令,SKIPME yes 能保证工具自身不会被断开。反过来,如果希望断开所有连接包括自己,需要明确 SKIPME no,但生产环境极少需要这样做。
CLIENT KILL 的定位与运维建议
从连接管理角度看,CLIENT KILL 只是应急手段,不是连接治理的最终方案。长期稳定的 Redis 实例应该从客户端连接池参数、服务器超时时间、ACL 账号授权和网络防火墙几个层面控制连接行为。Redis 的 timeout 参数可以配置服务端自动关闭空闲连接,但从 Redis 3.2 开始,timeout 不会断开 replica 连接。连接池的 maxIdle、minEvictableIdleTimeMillis 等参数也应与服务端策略匹配,避免客户端判断连接可用但服务端已将其关闭。
在排查连接相关故障时,建议优先看 CLIENT LIST 的 flags 字段。常见标志中,N 表示普通客户端,S 表示从节点连接,O 表示主节点连接,P 表示 Pub/Sub 连接。结合 idle 和 cmd 可以快速判断哪些连接异常。如果连接数接近 maxclients,可以先从 CLIENT LIST 中统计 addr 或 user 分布,再用 CLIENT KILL 精确处理,而不是一上来就 MAXAGE 0。
另外,CLIENT KILL 的执行需要相应权限。在启用 ACL 的 Redis 6 及以上版本中,执行 CLIENT KILL 需要客户端具备 @admin 或 @dangerous 命令权限,普通只读账号无法执行。这避免低权限用户随意断开他人连接。配置 ACL 时可以限制 CLIENT KILL 的使用范围,仅运维账号拥有该权限。
# 给运维账号授予客户端管理能力 127.0.0.1:6379> ACL SETUSER opsuser on >strongpassword +@admin +@dangerous OK # 普通账号不授予 CLIENT KILL 127.0.0.1:6379> ACL SETUSER appuser on >apppassword +get +set +info OK
总结下来,CLIENT KILL 是 Redis 客户端连接管理中的一个实用工具,但真正用好它需要理解新旧语法差异、过滤条件的逻辑与组合、类型字段含义,以及断开连接后的连锁反应。遇到连接数突增时,先用 CLIENT LIST 摸清情况,再按 ID、ADDR、TYPE 或 USER 精准处理,避免用 MAXAGE 0 这类无差别操作。对于自动重连的客户端,断开后要配合 ACL、防火墙或连接池配置才能真正解决问题。
Redis CLIENT KILL客户端连接管理CLIENT KILL命令修改时间:2026-09-25 20:22:35