当前位置:首页 > 问答 > 正文

Redis怎么查所有客户端连接状态,快速看清楚当前连了哪些人和情况

要快速看清楚Redis当前有哪些客户端连接以及它们的具体情况,最直接有效的方法就是使用Redis自带的命令行工具和其提供的监控命令,这些信息对于了解数据库的负载、排查问题、发现异常连接至关重要。

核心命令:CLIENT LIST

根据Redis官方文档,CLIENT LIST 命令是获取所有客户端连接详情的核心命令,直接在Redis服务器的命令行界面(通常使用 redis-cli 工具连接后)输入 CLIENT LIST,就会返回一个包含所有已连接客户端信息的列表。

这个命令返回的结果看起来可能有点复杂,因为它包含了非常多的字段,每个字段代表客户端连接的一个方面,为了快速看清楚,我们不需要关注所有字段,而是抓住几个关键信息,根据Redis官方文档对客户端命令的说明,这些关键字段包括:

  • id: 客户端的唯一连接标识符,这个ID在Redis实例的生命周期内是单调递增的,可以用来唯一识别一个连接。
  • addr: 客户端的地址和端口,格式通常是 IP:端口号,这能立刻告诉你这个连接是从哪台机器发起的,这是判断连接来源最重要的信息。
  • fd: 客户端对应的套接字文件描述符,这个更多是Redis服务器内部使用的标识。
  • name: 客户端的名称,这个名称可以通过 CLIENT SETNAME 命令来设置,如果应用程序为其连接设置了有意义的名称(order-service-backup"),那么这里就会显示出来,极大地提高了可读性,如果没设置,就是空的。
  • age: 连接已经建立了多少秒,连接时间过长可能代表是持久连接,而过短则可能是短连接或者刚刚重连。
  • idle: 连接已经空闲了多少秒,即多久没有执行过命令了,这个值非常大(比如几小时、几天)的连接,很可能是连接泄漏(应用程序建立了连接但忘记关闭)或者僵尸连接,可以考虑清理。
  • flags: 客户端连接的标志位,表示连接的属性,这是一个复合值,可能包含多个字母,
    • N: 表示普通的客户端。
    • M: 表示当前连接是主服务器(在复制上下文中)。
    • S: 表示当前连接是从服务器。
    • O: 表示客户端正在执行阻塞操作(如 BLPOP)。
    • u: 表示客户端未被阻塞。
    • A: 表示尽可能快地关闭连接。
    • 等等,通过这个标志可以快速判断连接的角色和状态。
  • db: 客户端当前正在使用的数据库编号,Redis有多个命名空间(默认16个,编号0-15),这个字段告诉你客户端正在操作哪个库。
  • sub: 客户端通过订阅(SUBSCRIBE)命令订阅的频道数量。
  • psub: 客户端通过模式订阅(PSUBSCRIBE)命令订阅的频道模式数量。
  • omem: 客户端输出缓冲区占用的内存大小(以字节为单位),如果这个值异常高,可能意味着有慢客户端无法及时接收数据,导致数据在服务器端堆积,需要警惕。
  • cmd: 客户端最后一次执行的命令,这对于了解客户端正在做什么非常有帮助。

如何让信息更清晰易读?

Redis怎么查所有客户端连接状态,快速看清楚当前连了哪些人和情况

原始的 CLIENT LIST 输出是所有连接信息挤在一行,用空格分隔,阅读起来很不方便,我们可以利用一些技巧来美化输出。

  1. 使用 redis-cli 的格式化输出: 当你使用 redis-cli 连接时,可以给 CLIENT LIST 命令加上特殊参数,让其以更清晰的表格形式显示,命令是:

    redis-cli client list

    注意,这里不是在已经连接的redis-cli内部输入,而是直接在系统shell中执行,这个命令会自动将结果格式化,让每个字段对齐,看起来一目了然,根据Redis命令行界面的文档,这是一种更友好的查看方式。

  2. 结合系统工具进行过滤和排序: 如果连接数非常多,你可能只关心特定信息,这时可以结合Linux/Unix的命令行工具,如 grepsort

    Redis怎么查所有客户端连接状态,快速看清楚当前连了哪些人和情况

    • 查找来自特定IP的连接
      redis-cli client list | grep '192.168.1.100'
    • 找出空闲时间最长的连接(可能用于排查连接泄漏)
      redis-cli client list | sort -k 6 -nr

      (这里假设idle字段在第六列,可能需要根据实际输出调整列号)

实时监控连接动态

如果想实时观察连接的建立和断开,类似于top命令监控系统进程一样,可以使用 redis-cli--stat 模式的一个变体,或者使用 MONITOR 命令,但 MONITOR 会打印出所有命令,信息量巨大,不适合专门看连接,一个更取巧的方法是定期执行 CLIENT LIST 并清屏。

在Linux/Mac上可以这样做:

Redis怎么查所有客户端连接状态,快速看清楚当前连了哪些人和情况

watch -n 1 "redis-cli client list"

这条命令会每秒执行一次 redis-cli client list 并刷新屏幕,让你能动态地看到连接的变化。

其他相关管理命令

除了查看,Redis官方文档还提供了一些直接管理客户端的命令:

  • CLIENT KILL: 根据IP和端口断开指定客户端的连接,用于踢掉异常或危险的连接。
  • CLIENT KILL TYPE: 断开所有特定类型的连接(如 normal, pubsub, replica)。
  • CLIENT PAUSE: 在指定的毫秒数内暂停所有客户端命令,这是一个非常有影响力的操作,通常用于故障转移等维护场景,需要谨慎使用。
  • CLIENT SETNAME/ CLIENT GETNAME: 为当前连接设置或获取名称,强烈建议在应用程序中为连接设置一个有意义的名称,这样在查看 CLIENT LIST 时就能迅速定位。

总结一下快速看清楚的步骤:

  1. 打开终端,使用 redis-cli 连接到你的Redis服务器。
  2. 输入 CLIENT LIST 命令。
  3. 如果觉得格式乱,退出redis-cli,直接在系统shell执行 redis-cli client list 获得格式化表格。
  4. 重点关注 addr(谁连的)、idle(空闲多久了)、name(叫什么名字)、cmd(最后干了啥)、omem(输出队列大不大)这几个字段。
  5. 如果需要动态监控,使用 watch 命令配合 CLIENT LIST

通过以上方法,你就能快速、清晰地掌握Redis当前的客户端连接状况。