redis-cli的monitor命令可实时打印所有指令但仅限调试环境,因性能开销大、无过滤能力、输出非结构化,生产环境应禁用;推荐用slowlog(设slowlog-log-slower-than为0)替代。

redis-cli 的 monitor 命令能实时看到所有指令,但只适合调试环境
它会把每个到达服务器的命令原样打印出来,包括时间戳、客户端地址和完整参数。但代价很高:每条命令都会被序列化、复制、网络传输,对高流量实例会造成明显性能抖动,甚至触发 OOM 或连接超时。
- 必须在 Redis 服务端未启用
rename-command MONITOR ""配置,否则会报错(error) ERR unknown command `monitor` - 不支持过滤——你无法只看某个 DB、某个客户端或某类命令(比如只看
SET),得靠外部工具(如grep)筛 - 输出是纯文本流,没有结构化字段,写脚本解析容易因空格、引号、嵌套数组崩掉
- 建议只在低峰期、临时连上 debug,执行完立刻
Ctrl+C中断;生产环境禁用
想看指定客户端的指令?用 client list + client getname 配合日志定位
Redis 本身不提供“按 client ID 过滤 monitor”的能力,但你可以先用 client list 找出目标连接,再结合慢日志或 audit 日志反查行为。
-
client list输出里关注id、addr、cmd(当前正在执行的命令)、qbuf(输入缓冲区大小)和omem(输出缓冲区内存) - 如果客户端设置了名字(通过
client setname myapp:worker1),用client list能直接筛选:client list | grep "name=myapp:worker1" - 注意:
cmd字段只显示「当前阻塞的命令」,不是历史记录;长时间运行的KEYS或SCAN可能卡在这里,但已执行完的命令不会留下痕迹 - 真正要追溯某客户端干了什么,得依赖 Redis 的
slowlog(需提前配置slowlog-log-slower-than 0)或外部代理层(如 redis-proxy)的日志
生产环境替代方案:开启 slowlog 并设为 0,配合 slowlog get 查最近操作
把 slowlog-log-slower-than 设成 0,会让 Redis 记下每一条命令(含参数、执行耗时、时间戳),比 monitor 安全得多——它不实时推送,只写内存环形缓冲区,且可配置最大长度(slowlog-max-len)防爆。
- 设置方式:
CONFIG SET slowlog-log-slower-than 0,并确认CONFIG SET slowlog-max-len 1000(默认 128 太小) -
slowlog get 10返回最近 10 条,每条含id、timestamp、duration(微秒)、command(数组形式,如["GET","user:123"]) - 缺点:不包含客户端 IP 或名字;命令参数会被截断(默认 128 字符),大 value 或长 key 可能看不到全貌
- 重启后 slowlog 清空,如需持久化,得自己定时
slowlog get并落盘
为什么不用 redis-cli --stat 或 INFO commandstats?
它们只统计聚合信息,完全没法满足“实时观察正在执行的指令”这个需求。
-
redis-cli --stat只刷新 QPS、内存、连接数等指标,没有命令明细 -
INFO commandstats返回的是各命令的调用次数和总耗时(如cmdstat_get:calls=12345,usec=67890,usec_per_call=5.5),连时间窗口都没有 - 二者都属于“事后归因”工具,不是“实时观测”手段;混淆它们会导致排查时浪费大量时间在错误路径上
真正要盯住某条指令的生命周期,目前只有 monitor(临时)、slowlog(带延迟但安全)、或在客户端侧加埋点(最准但需改代码)。三者之间没有银弹,选哪个取决于你能不能接受延迟、有没有改客户端的权限、以及当前是不是正在线上救火。








