先确认连接节点、阈值和日志轮转情况——集群中80%的“查不到慢查询”问题源于连错节点、slowlog-log-slower-than设过高或slowlog-max-len过小导致日志被覆盖。

直接结论:别先跑 SLOWLOG GET,先确认你连的是哪个节点、阈值设对没、日志有没有被轮掉——集群里 80% 的“查不到慢查询”问题,都卡在这三步。
怎么确认当前连接的是目标 Redis 节点(尤其是集群)
集群中每个节点维护独立的慢查询日志,SLOWLOG 命令不跨节点生效。连错节点等于白查。
- 用
redis-cli -h node-ip -p port显式指定地址端口,不要依赖代理或中间件自动路由 - 执行
CLUSTER NODES或INFO server确认当前实例角色(master / slave)和节点 ID - 如果用 Lettuce 或 Jedis 连集群,它们默认可能路由到随机节点;排查时务必切到
redis-cli手动直连 - 常见误操作:在哨兵模式下连了 sentinel 地址(如
redis-cli -h sentinel-host -p 26379),这根本不是 Redis server,SLOWLOG会报错
为什么 SLOWLOG GET 10 返回空,但监控显示延迟飙升
空结果 ≠ 没有慢查询,更可能是配置或采集时机问题。
-
slowlog-log-slower-than默认是10000(10ms),但业务 P99 要求是 2ms?那 3ms 的命令就进不了日志——用CONFIG GET slowlog-log-slower-than看真实值 -
slowlog-max-len默认仅 128 条,高 QPS 下几秒就刷满,旧记录被 FIFO 淘汰;用SLOWLOG LEN查当前条数,若长期是 128,说明日志在持续溢出 - 命令执行耗时只统计“服务端执行阶段”,不包括网络传输、排队等待;所以客户端超时 ≠
SLOWLOG有记录 - 某些命令(如
SCAN带大COUNT、HGETALLon big hash)可能分片执行,单次不超阈值,但累积阻塞线程——这类需结合INFO commandstats看调用频次与总耗时
如何快速定位到具体 key 和 slot(避免盲目扫全量)
SLOWLOG 只给命令和参数(如 ["LRANGE", "mylist", "0", "-1"]),不暴露 key 所属 slot 或节点拓扑,必须手动映射。
- 从日志中提取第一个参数作为 key(注意:部分命令如
KEYS *没明确 key,得看第二字段) - 用
CLUSTER KEYSLOT算出 slot 编号(如CLUSTER KEYSLOT user:1001→12345) - 再用
CLUSTER GETKEYSINSLOT 12345 1验证该 slot 当前是否真存这个 key(防哈希漂移或迁移未完成) - 关键提醒:
CLUSTER KEYSLOT是确定性哈希,但CLUSTER GETKEYSINSLOT返回的是当前节点该 slot 下的 key 列表——如果返回空,说明 key 不在本节点,要换节点重试
为什么不能在巡检脚本里无条件 SLOWLOG RESET
重置操作会清空当前节点日志,但集群其他节点还在写入;一旦问题复现窗口短,你就永远丢掉了根因证据。
- 真正需要 reset 的场景极少:比如刚上线新配置,想清掉历史干扰项;或内存告警且
slowlog-max-len设得过大(如 10000)导致内存占用异常 - 安全做法:先
SLOWLOG GET 1000 > slowlog_$(date +%s).log保存快照,再SLOWLOG RESET - 更轻量替代:用
SLOWLOG LEN监控日志水位,配合告警(如 >1000 条持续 5 分钟),而不是定时清空 - 最大陷阱:在自动化扩容/缩容脚本中加入
SLOWLOG RESET,结果 A 节点日志清了,B 节点正爆发慢查询,你却以为“一切正常”
最易被忽略的一点:slowlog-log-slower-than 和 slowlog-max-len 是运行时可改的,但 CONFIG REWRITE 不一定成功——某些云托管 Redis(如阿里云 Tair、腾讯云 CRS)禁用该命令,改完必须手动同步到配置文件并重启,否则重启即失效。











