redis变慢是单线程模型下多个阻塞点叠加的必然结果,关键在于是否超出业务容忍阈值;需通过--latency和--intrinsic-latency测基线、比对业务日志与slowlog时间戳、检查cpu/内存/swap/thp等底层因素闭环排查。

Redis 延迟波动不是偶发“卡顿”,而是单线程模型下多个阻塞点叠加的必然结果。只要命令执行时间不恒定,延迟毛刺就一定会出现——关键在于是否超出你的业务容忍阈值。
怎么确认是 Redis 自身变慢,而不是网络或业务侧问题
别急着改配置或扩容,先排除链路干扰:
- 用
redis-cli --latency -h {host} -p {port}测基线:在低负载时跑 100 秒,看最大延迟是否稳定在 100μs 以内;超过 500μs 就值得警惕 - 对比
redis-cli --intrinsic-latency 100输出:这个命令绕过网络,只测 Redis 内核处理空命令的延迟,如果这里也飙高(比如 >1ms),说明问题在 Redis 进程内部 - 检查业务日志中 Redis 调用耗时和网络耗时是否同步升高:如果只有 Redis 耗时涨、TCP RTT 没变,基本可锁定 Redis 本体
- 用
tcpdump抓包比对客户端发包和收包时间差,排除中间设备(如代理、防火墙)引入的抖动
slowlog 是第一线索,但容易误读
slowlog 记录的是命令执行耗时,不包含排队时间和网络传输时间。一个 GET 出现在 slowlog 里,未必是它自己慢,可能是前面有个 SORT 占着线程没释放。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 执行
SLOWLOG GET 10,重点看第三字段(微秒级耗时)和第四字段(完整命令),不要只扫命令名 - 把 slowlog 时间戳和业务报错时间对齐:如果某次超时发生在 14:23:05.123,而最近一条 slowlog 是 14:23:05.120 且耗时 820000μs,大概率就是它堵住了后续所有请求
-
CONFIG SET slowlog-log-slower-than 1000(即 1ms 阈值),默认 10ms 太宽松,毫秒级抖动根本捕不到 - 注意
slowlog-max-len不要设太小,否则高频慢操作会被覆盖,建议至少 1000
大 key 删除、过期、AOF rewrite 是隐形定时炸弹
这些操作看似“后台”执行,实则会间歇性抢占主线程 CPU 或触发内存拷贝,导致延迟尖峰。
-
DEL bighash不是 O(1),而是 O(N),N 是哈希表 field 数量;UNLINK可异步释放内存,应替代所有DEL - 大量 key 集中过期时,Redis 会在
serverCron中批量清理,可能卡住主线程;用EXPIREAT错开过期时间,或启用lazyfree-lazy-expire yes - AOF rewrite 期间,子进程 fork 会触发 Copy On Write,如果 Redis 内存使用率达 80%+,fork 耗时可能达百毫秒;监控
latest_fork_seconds指标,超过 100ms 就要调低auto-aof-rewrite-percentage - 内存碎片率(
mem_fragmentation_ratio)> 1.5 时,ALLOC分配新对象可能失败并触发内存整理,加剧延迟;定期执行MEMORY MALLOC-STATS查看碎片分布
CPU 和内存底层行为常被忽略
Redis 运行在 OS 之上,内核调度、内存交换、NUMA 绑核不当,都会让延迟从微秒跳到毫秒甚至秒级。
- 用
top -H -p $(pgrep redis)看 Redis 主进程线程的 %CPU 是否持续 >90%,如果是,说明命令复杂度真超标了(比如频繁ZUNIONSTORE) -
cat /proc/$(pgrep redis)/status | grep VmSwap非零即已 swap,必须立刻干预:降低maxmemory、关闭vm.swappiness、或加物理内存 - Redis 默认不绑核,多核机器上可能被调度到不同 CPU,缓存失效加重延迟;用
taskset -c 0-3 redis-server redis.conf固定 CPU 核心 - 开启透明大页(THP)会导致 fork 缓慢,CentOS/RHEL 默认启用,务必执行
echo never > /sys/kernel/mm/transparent_hugepage/enabled
真正棘手的延迟波动,往往来自多个因素叠加:比如 AOF rewrite 正在进行,同时又来了一个大 key 删除,再加上 THP 开启,三者共振就能打出 2~3 秒的毛刺。单点优化效果有限,得按「基线测量 → slowlog 定位 → 内存/CPU 排查」顺序闭环验证,漏掉任意一环都可能白忙活。










