redis-cli 延迟与大键诊断
更新时间:2026-09-18。Redis「卡」可能是网络、慢命令或大键。
redis-cli自带一组免装工具直接定位。原理见 Redis BigKey/HotKey 的危害与定位拆分,内存满处置见 Redis 内存满了怎么办。
一、测延迟
bash
# 持续 PING 测 RTT(Ctrl-C 出 min/max/avg 分布)
redis-cli -h <host> -p 6379 --latency
# min: 0, max: 2, avg: 0.45 (1200 samples)
# 每隔一段采样一次,看延迟随时间波动
redis-cli -h <host> --latency-history -i 5
# 测“命令处理延迟”(排除网络,在 Redis 同机执行更有意义)
redis-cli -h <host> --intrinsic-latency 10--latency高而--intrinsic-latency正常 → 多为网络/客户端问题。- 两者都高 → Redis 主机自身问题(CPU 被抢占、持久化 fork、AOF fsync、大键阻塞)。
二、慢命令
bash
redis-cli SLOWLOG GET 20 # 最近 20 条慢命令(含耗时微秒、参数)
redis-cli CONFIG GET slowlog-log-slower-than # 阈值(微秒),默认 10000=10ms
redis-cli INFO stats | grep -Ei 'instantaneous|connected|rejected'
redis-cli INFO commandstats # 各命令调用次数与总耗时,找异常命令三、大键 / 热点键 / 内存大户
bash
# 各类型最大 key(SCAN 遍历,生产低峰执行)
redis-cli --bigkeys
# 内存占用最大的 key
redis-cli --memkeys
# 热点 key:需先开启 LFU 淘汰策略
redis-cli CONFIG SET maxmemory-policy allkeys-lfu
redis-cli --hotkeys--bigkeys 对每种类型给出 Top key 和大小(string 看字节、list/hash/set/zset 看元素数)。也可针对性诊断单个键:
bash
STRLEN k # string 字节数
HLEN k / LLEN k / SCARD k / ZCARD k # 容器元素数
MEMORY USAGE k # 该 key 实际占用字节(含开销)四、大键处置
发现大键不要直接 DEL:删除一个含百万元素的容器会阻塞事件循环(单线程)。用渐进删除:UNLINK(异步释放)或分批 HSCAN+HDEL/SSCAN+SREM/ZSCAN+ZREMRANGEBYRANK,并在低峰做。
常见坑
- 生产高峰跑
--bigkeys:虽用 SCAN 比KEYS *温和,但仍遍历全键空间增加负载,低峰执行或在从节点跑。 - 用
KEYS *排障:O(N) 直接阻塞,禁用;一律 SCAN 或上述专用命令。 --bigkeys只报每类最大:可能漏掉多个中等偏大的键,结合--memkeys与MEMORY USAGE。- 在线 DEL 大键:阻塞导致 RT 尖刺,用
UNLINK/分批删。 --hotkeys不生效:依赖 LFU(maxmemory-policy 为*lfu),默认 LRU 策略下取不到。- 把网络延迟当 Redis 慢:先用 intrinsic-latency 区分主机与网络,再看 SLOWLOG。
总结
*redis-cli 免装即可做三件事:用 --latency/--latency-history 测网络往返、用 --intrinsic-latency 在主机侧测 Redis 自身命令延迟以区分网络与主机瓶颈;用 SLOWLOG GET 和 INFO commandstats 找慢命令与高频命令;用 --bigkeys、--memkeys 和 --hotkeys(后者需先切 LFU)配合 MEMORY USAGE、HLEN/ZCARD 等定位大键和热点键。生产上务必低峰或在从节点跑扫描、绝不使用 KEYS ,并且发现大键不能直接 DEL——单线程下删除超大容器会阻塞事件循环,应改用 UNLINK 异步释放或 HSCAN/SCAN 分批渐进删除。