当前位置: 首页 > news >正文

Redis突然变慢了?你可能踩了这几个隐蔽的坑

最近线上 Redis 老是隔三差五地抽风,时而响应时间飙到几百毫秒,时而又恢复正常,看监控 qps 也没暴涨啊。一开始我以为是网络抖动,后来发现根本不是那么回事,而是踩了几个非常隐蔽的坑。排查过程里我顺手写了个小脚本,一键就能把这些坑扫出来,省得每次都要手动敲一堆命令。今天就跟你聊聊我踩过的这些坑,顺便把脚本的核心逻辑拆一拆。


脚本大概长这样,我会随着坑一个个讲,把代码片段拆出来给你看。

第一个坑:慢查询在那儿慢慢积着,你没看见

很多时候 Redis 变慢并不是因为请求量大,而是某些命令执行时间太长了,比如对一个有几百万个元素的 set 做 SMEMBERS,或者 keys * 这种扫全库的操作。慢查询日志是 Redis 自带的东西,但好多人根本不看它。我脚本里第一件事就是去捞慢查询:

# 获取最近10条慢查询,超过1000微秒就算慢
slowlog=$(redis-cli slowlog get 10)
echo "$slowlog" | while read line; do# slowlog 输出格式:1) (integer) 123  2) (integer) 1620000000  3) (integer) 15234  4) 1) "KEYS" 2) "*"# 提取 id、时间戳、执行耗时(微秒) 和命令id=$(echo "$line" | awk 'NR==1{print $2}')timestamp=$(echo "$line" | awk 'NR==2{print $2}')duration=$(echo "$line" | awk 'NR==3{print $2}')cmd=$(echo "$line" | awk 'NR==4{$1=""; print $0}')if [ "$duration" -gt 10000 ]; thenecho "⚠️  慢查询 id=$id,耗时 ${duration}μs,命令: $cmd"fi
done

这个片段就是拿 slowlog,然后把耗时超过 10 毫秒的揪出来。很多时候你会发现有那种不经意间跑出来的 KEYS 或者大集合的聚合操作,一抓一个准。

第二个坑:客户端输出缓冲区被撑爆了

Redis 是单线程处理命令的,如果某个客户端的输出缓冲区满了,它就会把这个客户端挂起,直到缓冲区有空间。这时候其他客户端的请求会被阻塞,表现出来就是延迟突然变高。排查这个得看 client list 里的 obl 和 oll 字段。脚本里我会抓一下有哪些客户端 buffer 快满了:

# 检查所有客户端的输出缓冲区使用情况
redis-cli client list | awk -F'[ =]' '{# 提取 obl(输出缓冲区长度)、oll(输出列表长度)、omem(输出缓冲区占用内存)for(i=1;i<=NF;i++){if($i=="obl") obl=$(i+1)if($i=="oll") oll=$(i+1)if($i=="omem") omem=$(i+1)}if(obl>0 || oll>0){printf "客户端 %s 输出缓冲区 obl=%s oll=%s omem=%s\n", $1, obl, oll, omem}
}'

一旦看到某个客户端的 omem 很大,比如几十 MB,那基本就是它在大量订阅频道或者批量取数据,把 Redis 给拖慢了。

第三个坑:RDB 持久化在后台偷偷 fork 导致卡顿

Redis 做 RDB 持久化时会 fork 一个子进程,如果内存很大(比如 10GB 以上),fork 操作本身会阻塞主线程几毫秒甚至更久。而且 COW(写时复制)机制下,如果父进程写入频繁,需要复制大量内存页,也会带来延迟。脚本里我会看最近的 bgsave 状态和用时:

# 获取最近一次 bgsave 的状态和耗时
info=$(redis-cli info persistence)
last_bgsave_status=$(echo "$info" | grep "rdb_last_bgsave_status" | cut -d: -f2)
last_bgsave_time=$(echo "$info" | grep "rdb_last_bgsave_time_sec" | cut -d: -f2)
if [ "$last_bgsave_time" -gt 30 ]; thenecho "⚠️  最近一次 bgsave 耗时 ${last_bgsave_time} 秒,可能造成卡顿"
fi
# 顺便看看当前是否正在执行 aof 重写,也一样会 fork
aof_rewrite=$(redis-cli info persistence | grep "aof_rewrite_in_progress:1")
if [ -n "$aof_rewrite" ]; thenecho "⚠️  当前 AOF 重写正在进行,可能影响性能"
fi

有时候运维在业务高峰期配了个自动备份,刚好和写入高峰撞上,那延迟就上去了。

第四个坑:大 key 把网络带宽和 CPU 都占满

大 key 的读取会占用大量网络带宽和 CPU 序列化时间,而且删除它也会阻塞 Redis。脚本里我用 redis-cli --bigkeys 的输出来解析,但那个命令本身是扫描的,可能加重负载,所以我会加个采样判断:

# 使用 scan 扫描 key 并粗略估算大小,仅输出超过 1MB 的 key
cursor=0
while true; doresult=$(redis-cli scan $cursor count 1000)cursor=$(echo "$result" | head -1)keys=$(echo "$result" | tail -n +2)for k in $keys; dosize=$(redis-cli memory usage "$k" 2>/dev/null)if [ "$size" -gt 1048576 ]; thenecho "大 key: $k 占用 ${size} 字节"fidone[ "$cursor" -eq 0 ] && break
done

注意 memory usage 命令需要 Redis 4.0 以上,它比 debug object 更准。扫出来一堆几 MB 的 hash 或者 list,就是导致网卡流量跑满的元凶。

第五个坑:内存碎片高得离谱,但内存又没满

Redis 的内存分配器(如 jemalloc)会产生碎片,当碎片率过高时,虽然内存够用,但实际上分配新内存会变慢,甚至触发 eviction 策略。脚本里会检查 mem_fragmentation_ratio

frag=$(redis-cli info memory | grep "mem_fragmentation_ratio" | cut -d: -f2)
if [ "$(echo "$frag > 1.5" | bc)" -eq 1 ]; thenecho "⚠️  内存碎片率: $frag,大于 1.5 建议考虑重启或启用 activedefrag"
fi

如果碎片率超过 1.5,尤其在频繁更新不同大小 value 的场景下,考虑开启 activedefrag 或者挑个低峰重启。


脚本把这些检测集成在一起,执行一下就把可疑点全列出来了,帮我省了不少时间。当然具体的阈值需要根据你的业务调整,比如慢查询的阈值、bgsave 耗时的容忍度等等。

实际生产里很多 Redis 突然变慢的锅,都是这些“藏得很深”的问题——慢查询不去看,客户端 buffer 满了不去查,fork 引起的卡顿被监控曲线平滑掉,大 key 带偏整个集群。希望这些经验和你看到的脚本片段能让你下次排查的时候有个方向,不用再猜来猜去。

http://www.jsqmd.com/news/970341/

相关文章:

  • 抖音批量下载工具完全指南:5分钟掌握无水印视频下载技巧
  • Agent开发系列(十)-知识库建设(架构总览)
  • 终极指南:如何让老款Mac重获新生——OpenCore Legacy Patcher完整教程
  • 抖音批量下载终极指南:5分钟免费获取无水印视频素材
  • 中通快递10斤要多少钱?2026最新寄件省钱攻略 - 快递物流资讯
  • 东莞墙面刷新多少钱一平方?2026年报价明细+品牌对比+怎么选 - 优家闲谈
  • 百度网盘解析工具:绕过限速的技术实现方案
  • 为什么你的微服务改造总失败?谈谈领域驱动设计的落地痛点
  • 嵌入式触摸屏数字键盘实现:图片映射与区域检测方案详解
  • Prometheus + Grafana 云原生可观测性体系:从指标采集到告警闭环的完整实践
  • CSDN AI数字营销企业采购必读:团购门槛、账号绑定规则、续费锁价机制(内部渠道限时开放中)
  • “照得标”下载页面
  • 天津品牌小程序制作怎么选 2026 精选榜单参考 | 6月最新整理 - 软件测评师
  • 2026回本实测解密:68%商家AI直播闲置亏损!
  • 压敏电阻选型与应用指南:从原理到电路保护设计
  • Chrome浏览器密码输入行为捕获工具:专为授权安全测试设计的轻量级扩展
  • 2026年济南驾校大揭秘:哪家学员数量最多?速来一探究竟! - 资讯纵览
  • 从零到一:Happy Island Designer 终极实战指南 [特殊字符]️
  • 拯救你的代码规范:手把手教你配置STS的代码模板与实时检查(告别脏乱差)
  • Kubernetes 生产环境排障实录:典型故障案例与诊断方法论
  • 2026年杭州AI搜索优化公司深度GEO源头实力横评与选型避坑白皮书 - 品牌报告
  • Visdom 0.2.x 可直接运行的完整部署包,含前后端全部文件与预编译缓存
  • 【分享】3.1 面试官不是中立的裁判,他有他自己的议程
  • 崩坏星穹铁道全自动游戏助手:三月七小助手终极指南
  • 全平台B站客户端终极指南:wiliwili 10分钟快速上手教程
  • CSDN数字营销赔付实操手册:从内容预审→实时监测→违规拦截→费用返还,全流程6节点风控SOP(附自动化检测脚本)
  • 场效应管(FET)原理、参数与选型实战指南
  • 2026年三通电磁阀制造商盘点:口碑好、可定制、售后靠谱的有哪些 - 品牌推荐大师1
  • 手把手写你的第一个 Skill:5 分钟搞定
  • Docker 容器化最佳实践与安全加固方案