Redis 缓存高可用监控:实时监控内存碎片率、缓存命中率、Key 驱逐及集群节点状态
缓存命中率掉了 15%,业务方说"Redis 没挂啊"------确实没挂,但碎片率飙到了 3.2,驱逐线程每秒钟删掉 500 个 Key,集群里还有一个节点在慢性失联。这些事,redis_exporter 全知道。
一、一台"活着但废了"的 Redis
大促当天上午 10 点,缓存命中率从 92% 直线掉到 64%。
运维登录 Redis 执行 INFO stats,evicted_keys 的数字每刷新一次就涨几千。再查 INFO memory,碎片率 3.1。集群共 6 个节点,有 1 个响应延迟比其他节点高了 10 倍,但没彻底断连,监控没报警。
#mermaid-svg-KtLyZWnC4rv6gu40{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KtLyZWnC4rv6gu40 .error-icon{fill:#552222;}#mermaid-svg-KtLyZWnC4rv6gu40 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KtLyZWnC4rv6gu40 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KtLyZWnC4rv6gu40 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KtLyZWnC4rv6gu40 .marker.cross{stroke:#333333;}#mermaid-svg-KtLyZWnC4rv6gu40 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KtLyZWnC4rv6gu40 p{margin:0;}#mermaid-svg-KtLyZWnC4rv6gu40 .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-KtLyZWnC4rv6gu40 .exclude-range{fill:#eeeeee;}#mermaid-svg-KtLyZWnC4rv6gu40 .section{stroke:none;opacity:0.2;}#mermaid-svg-KtLyZWnC4rv6gu40 .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-KtLyZWnC4rv6gu40 .section2{fill:#fff400;}#mermaid-svg-KtLyZWnC4rv6gu40 .section1,#mermaid-svg-KtLyZWnC4rv6gu40 .section3{fill:white;opacity:0.2;}#mermaid-svg-KtLyZWnC4rv6gu40 .sectionTitle0{fill:#333;}#mermaid-svg-KtLyZWnC4rv6gu40 .sectionTitle1{fill:#333;}#mermaid-svg-KtLyZWnC4rv6gu40 .sectionTitle2{fill:#333;}#mermaid-svg-KtLyZWnC4rv6gu40 .sectionTitle3{fill:#333;}#mermaid-svg-KtLyZWnC4rv6gu40 .sectionTitle{text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-KtLyZWnC4rv6gu40 .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-KtLyZWnC4rv6gu40 .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-KtLyZWnC4rv6gu40 .grid path{stroke-width:0;}#mermaid-svg-KtLyZWnC4rv6gu40 .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-KtLyZWnC4rv6gu40 .task{stroke-width:2;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskText{text-anchor:middle;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutsideRight{fill:black;text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-KtLyZWnC4rv6gu40 .task.clickable{cursor:pointer;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskText0,#mermaid-svg-KtLyZWnC4rv6gu40 .taskText1,#mermaid-svg-KtLyZWnC4rv6gu40 .taskText2,#mermaid-svg-KtLyZWnC4rv6gu40 .taskText3{fill:white;}#mermaid-svg-KtLyZWnC4rv6gu40 .task0,#mermaid-svg-KtLyZWnC4rv6gu40 .task1,#mermaid-svg-KtLyZWnC4rv6gu40 .task2,#mermaid-svg-KtLyZWnC4rv6gu40 .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutside0,#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutside2{fill:black;}#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutside1,#mermaid-svg-KtLyZWnC4rv6gu40 .taskTextOutside3{fill:black;}#mermaid-svg-KtLyZWnC4rv6gu40 .active0,#mermaid-svg-KtLyZWnC4rv6gu40 .active1,#mermaid-svg-KtLyZWnC4rv6gu40 .active2,#mermaid-svg-KtLyZWnC4rv6gu40 .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-KtLyZWnC4rv6gu40 .activeText0,#mermaid-svg-KtLyZWnC4rv6gu40 .activeText1,#mermaid-svg-KtLyZWnC4rv6gu40 .activeText2,#mermaid-svg-KtLyZWnC4rv6gu40 .activeText3{fill:black!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .done0,#mermaid-svg-KtLyZWnC4rv6gu40 .done1,#mermaid-svg-KtLyZWnC4rv6gu40 .done2,#mermaid-svg-KtLyZWnC4rv6gu40 .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-KtLyZWnC4rv6gu40 .doneText0,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText1,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText2,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText3{fill:black!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .doneText0.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText0.taskTextOutsideRight,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText1.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText1.taskTextOutsideRight,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText2.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText2.taskTextOutsideRight,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText3.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .crit0,#mermaid-svg-KtLyZWnC4rv6gu40 .crit1,#mermaid-svg-KtLyZWnC4rv6gu40 .crit2,#mermaid-svg-KtLyZWnC4rv6gu40 .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-KtLyZWnC4rv6gu40 .activeCrit0,#mermaid-svg-KtLyZWnC4rv6gu40 .activeCrit1,#mermaid-svg-KtLyZWnC4rv6gu40 .activeCrit2,#mermaid-svg-KtLyZWnC4rv6gu40 .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-KtLyZWnC4rv6gu40 .doneCrit0,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCrit1,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCrit2,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-KtLyZWnC4rv6gu40 .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-KtLyZWnC4rv6gu40 .milestoneText{font-style:italic;}#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText0,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText1,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText2,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText3{fill:black!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText0.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText0.taskTextOutsideRight,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText1.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText1.taskTextOutsideRight,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText2.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText2.taskTextOutsideRight,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText3.taskTextOutsideLeft,#mermaid-svg-KtLyZWnC4rv6gu40 .doneCritText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .vert{stroke:navy;}#mermaid-svg-KtLyZWnC4rv6gu40 .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .activeCritText0,#mermaid-svg-KtLyZWnC4rv6gu40 .activeCritText1,#mermaid-svg-KtLyZWnC4rv6gu40 .activeCritText2,#mermaid-svg-KtLyZWnC4rv6gu40 .activeCritText3{fill:black!important;}#mermaid-svg-KtLyZWnC4rv6gu40 .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-KtLyZWnC4rv6gu40 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 10:00 10:30 11:00 11:30 12:00 12:30 13:00 13:30 14:00 14:30 15:00 15:30 碎片率持续爬升(1.1→2.4) 缓存命中率从92%掉到64% MySQL CPU飙到80% 人工介入定位问题 定位到问题并修复 潜伏期爆发期恢复期 故障时间线
业务方只知道"缓存不灵了",数据库被打到 80% CPU。这个故障持续了整整一上午才定位------如果有一个能实时反映 Redis"真实健康状况"的监控面板,30 分钟就能解决。
下面这套基于 redis_exporter 的监控体系,就是用来解决这类问题的。
二、redis_exporter 能干什么?
它连接 Redis 后定期执行 INFO、SLOWLOG、CLUSTER INFO 等命令,把输出转成 Prometheus 指标。
五大监控焦点及对应的指标
| 监控焦点 | 核心指标 | 指标含义 | 什么算异常 |
|---|---|---|---|
| 内存健康 | redis_memory_fragmentation_ratio |
操作系统分配内存 / Redis 实际使用内存 | > 1.5 或 < 1.0 |
| 缓存效率 | redis_keyspace_hits_total / redis_keyspace_misses_total |
命中次数 / 未命中次数 | 命中率 < 85% |
| 内存压力 | redis_evicted_keys_total |
累计驱逐 Key 数量 | 驱逐速率持续 > 50/秒 |
| 集群状态 | redis_cluster_known_nodes / redis_cluster_slots_fail |
已知节点数 / 故障槽位数 | 节点数减少 或 故障槽 > 0 |
| 慢操作 | redis_slowlog_length |
慢查询队列长度 | > 5 条未处理 |
三、整体监控架构

#mermaid-svg-BN0APY58UsuJB83c{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BN0APY58UsuJB83c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BN0APY58UsuJB83c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BN0APY58UsuJB83c .error-icon{fill:#552222;}#mermaid-svg-BN0APY58UsuJB83c .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BN0APY58UsuJB83c .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BN0APY58UsuJB83c .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BN0APY58UsuJB83c .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BN0APY58UsuJB83c .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BN0APY58UsuJB83c .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BN0APY58UsuJB83c .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BN0APY58UsuJB83c .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BN0APY58UsuJB83c .marker.cross{stroke:#333333;}#mermaid-svg-BN0APY58UsuJB83c svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BN0APY58UsuJB83c p{margin:0;}#mermaid-svg-BN0APY58UsuJB83c .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BN0APY58UsuJB83c .cluster-label text{fill:#333;}#mermaid-svg-BN0APY58UsuJB83c .cluster-label span{color:#333;}#mermaid-svg-BN0APY58UsuJB83c .cluster-label span p{background-color:transparent;}#mermaid-svg-BN0APY58UsuJB83c .label text,#mermaid-svg-BN0APY58UsuJB83c span{fill:#333;color:#333;}#mermaid-svg-BN0APY58UsuJB83c .node rect,#mermaid-svg-BN0APY58UsuJB83c .node circle,#mermaid-svg-BN0APY58UsuJB83c .node ellipse,#mermaid-svg-BN0APY58UsuJB83c .node polygon,#mermaid-svg-BN0APY58UsuJB83c .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BN0APY58UsuJB83c .rough-node .label text,#mermaid-svg-BN0APY58UsuJB83c .node .label text,#mermaid-svg-BN0APY58UsuJB83c .image-shape .label,#mermaid-svg-BN0APY58UsuJB83c .icon-shape .label{text-anchor:middle;}#mermaid-svg-BN0APY58UsuJB83c .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BN0APY58UsuJB83c .rough-node .label,#mermaid-svg-BN0APY58UsuJB83c .node .label,#mermaid-svg-BN0APY58UsuJB83c .image-shape .label,#mermaid-svg-BN0APY58UsuJB83c .icon-shape .label{text-align:center;}#mermaid-svg-BN0APY58UsuJB83c .node.clickable{cursor:pointer;}#mermaid-svg-BN0APY58UsuJB83c .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BN0APY58UsuJB83c .arrowheadPath{fill:#333333;}#mermaid-svg-BN0APY58UsuJB83c .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BN0APY58UsuJB83c .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BN0APY58UsuJB83c .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BN0APY58UsuJB83c .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BN0APY58UsuJB83c .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BN0APY58UsuJB83c .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BN0APY58UsuJB83c .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BN0APY58UsuJB83c .cluster text{fill:#333;}#mermaid-svg-BN0APY58UsuJB83c .cluster span{color:#333;}#mermaid-svg-BN0APY58UsuJB83c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BN0APY58UsuJB83c .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BN0APY58UsuJB83c rect.text{fill:none;stroke-width:0;}#mermaid-svg-BN0APY58UsuJB83c .icon-shape,#mermaid-svg-BN0APY58UsuJB83c .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BN0APY58UsuJB83c .icon-shape p,#mermaid-svg-BN0APY58UsuJB83c .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BN0APY58UsuJB83c .icon-shape .label rect,#mermaid-svg-BN0APY58UsuJB83c .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BN0APY58UsuJB83c .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BN0APY58UsuJB83c .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BN0APY58UsuJB83c :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 可视化
存储与告警
采集层
Redis 集群
Redis Node 1
Redis Node 2
Redis Node ...
redis_exporter
执行 INFO / SLOWLOG / CLUSTER INFO
Prometheus
指标存储 + 告警规则
Grafana 仪表盘
告警通知
四、指标实战详解
4.1 内存碎片率:Redis 的"骨质疏松"
Redis 在分配和释放内存时会产生碎片。碎片率过高意味着大量内存被浪费,碎片率低于 1.0 意味着 Redis 开始使用 swap------性能会瞬间崩塌。
#mermaid-svg-hkpGV9gyUXmVbUba{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hkpGV9gyUXmVbUba .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hkpGV9gyUXmVbUba .error-icon{fill:#552222;}#mermaid-svg-hkpGV9gyUXmVbUba .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hkpGV9gyUXmVbUba .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hkpGV9gyUXmVbUba .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hkpGV9gyUXmVbUba .marker.cross{stroke:#333333;}#mermaid-svg-hkpGV9gyUXmVbUba svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hkpGV9gyUXmVbUba p{margin:0;}#mermaid-svg-hkpGV9gyUXmVbUba .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hkpGV9gyUXmVbUba .cluster-label text{fill:#333;}#mermaid-svg-hkpGV9gyUXmVbUba .cluster-label span{color:#333;}#mermaid-svg-hkpGV9gyUXmVbUba .cluster-label span p{background-color:transparent;}#mermaid-svg-hkpGV9gyUXmVbUba .label text,#mermaid-svg-hkpGV9gyUXmVbUba span{fill:#333;color:#333;}#mermaid-svg-hkpGV9gyUXmVbUba .node rect,#mermaid-svg-hkpGV9gyUXmVbUba .node circle,#mermaid-svg-hkpGV9gyUXmVbUba .node ellipse,#mermaid-svg-hkpGV9gyUXmVbUba .node polygon,#mermaid-svg-hkpGV9gyUXmVbUba .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hkpGV9gyUXmVbUba .rough-node .label text,#mermaid-svg-hkpGV9gyUXmVbUba .node .label text,#mermaid-svg-hkpGV9gyUXmVbUba .image-shape .label,#mermaid-svg-hkpGV9gyUXmVbUba .icon-shape .label{text-anchor:middle;}#mermaid-svg-hkpGV9gyUXmVbUba .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hkpGV9gyUXmVbUba .rough-node .label,#mermaid-svg-hkpGV9gyUXmVbUba .node .label,#mermaid-svg-hkpGV9gyUXmVbUba .image-shape .label,#mermaid-svg-hkpGV9gyUXmVbUba .icon-shape .label{text-align:center;}#mermaid-svg-hkpGV9gyUXmVbUba .node.clickable{cursor:pointer;}#mermaid-svg-hkpGV9gyUXmVbUba .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hkpGV9gyUXmVbUba .arrowheadPath{fill:#333333;}#mermaid-svg-hkpGV9gyUXmVbUba .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hkpGV9gyUXmVbUba .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hkpGV9gyUXmVbUba .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hkpGV9gyUXmVbUba .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hkpGV9gyUXmVbUba .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hkpGV9gyUXmVbUba .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hkpGV9gyUXmVbUba .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hkpGV9gyUXmVbUba .cluster text{fill:#333;}#mermaid-svg-hkpGV9gyUXmVbUba .cluster span{color:#333;}#mermaid-svg-hkpGV9gyUXmVbUba div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hkpGV9gyUXmVbUba .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hkpGV9gyUXmVbUba rect.text{fill:none;stroke-width:0;}#mermaid-svg-hkpGV9gyUXmVbUba .icon-shape,#mermaid-svg-hkpGV9gyUXmVbUba .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hkpGV9gyUXmVbUba .icon-shape p,#mermaid-svg-hkpGV9gyUXmVbUba .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hkpGV9gyUXmVbUba .icon-shape .label rect,#mermaid-svg-hkpGV9gyUXmVbUba .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hkpGV9gyUXmVbUba .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hkpGV9gyUXmVbUba .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hkpGV9gyUXmVbUba :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 危险
警告
正常
碎片率 1.0 - 1.5
有效内存 ≈ 物理内存 ✅
碎片率 1.5 - 2.0
有效内存 = 物理内存的 50%-65% ⚠️
碎片率 > 2.0
有效内存 < 物理内存的 50% ❌
开始使用 swap → 性能崩塌
监控方式:
promql
# 当前碎片率
redis_memory_fragmentation_ratio
# 用告警规则盯住它
redis_memory_fragmentation_ratio > 1.8
某电商大促后发现碎片率长期在 2.0 以上,每天凌晨重启 Redis 临时解决。最终在配置中开启
activedefrag yes,配合设置active-defrag-cycle-min 5,碎片率稳定在 1.2 以下。
4.2 缓存命中率:判断"缓存有没有白设"的唯一标准
命中率低通常有两种情况:热数据量超过内存容量(需要扩容),或者过期时间设置太短(优化业务代码)。
#mermaid-svg-U7vE62uXqjLTpXpE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-U7vE62uXqjLTpXpE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-U7vE62uXqjLTpXpE .error-icon{fill:#552222;}#mermaid-svg-U7vE62uXqjLTpXpE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-U7vE62uXqjLTpXpE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-U7vE62uXqjLTpXpE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-U7vE62uXqjLTpXpE .marker.cross{stroke:#333333;}#mermaid-svg-U7vE62uXqjLTpXpE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-U7vE62uXqjLTpXpE p{margin:0;}#mermaid-svg-U7vE62uXqjLTpXpE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-U7vE62uXqjLTpXpE .cluster-label text{fill:#333;}#mermaid-svg-U7vE62uXqjLTpXpE .cluster-label span{color:#333;}#mermaid-svg-U7vE62uXqjLTpXpE .cluster-label span p{background-color:transparent;}#mermaid-svg-U7vE62uXqjLTpXpE .label text,#mermaid-svg-U7vE62uXqjLTpXpE span{fill:#333;color:#333;}#mermaid-svg-U7vE62uXqjLTpXpE .node rect,#mermaid-svg-U7vE62uXqjLTpXpE .node circle,#mermaid-svg-U7vE62uXqjLTpXpE .node ellipse,#mermaid-svg-U7vE62uXqjLTpXpE .node polygon,#mermaid-svg-U7vE62uXqjLTpXpE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U7vE62uXqjLTpXpE .rough-node .label text,#mermaid-svg-U7vE62uXqjLTpXpE .node .label text,#mermaid-svg-U7vE62uXqjLTpXpE .image-shape .label,#mermaid-svg-U7vE62uXqjLTpXpE .icon-shape .label{text-anchor:middle;}#mermaid-svg-U7vE62uXqjLTpXpE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-U7vE62uXqjLTpXpE .rough-node .label,#mermaid-svg-U7vE62uXqjLTpXpE .node .label,#mermaid-svg-U7vE62uXqjLTpXpE .image-shape .label,#mermaid-svg-U7vE62uXqjLTpXpE .icon-shape .label{text-align:center;}#mermaid-svg-U7vE62uXqjLTpXpE .node.clickable{cursor:pointer;}#mermaid-svg-U7vE62uXqjLTpXpE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-U7vE62uXqjLTpXpE .arrowheadPath{fill:#333333;}#mermaid-svg-U7vE62uXqjLTpXpE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-U7vE62uXqjLTpXpE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-U7vE62uXqjLTpXpE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U7vE62uXqjLTpXpE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-U7vE62uXqjLTpXpE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U7vE62uXqjLTpXpE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-U7vE62uXqjLTpXpE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-U7vE62uXqjLTpXpE .cluster text{fill:#333;}#mermaid-svg-U7vE62uXqjLTpXpE .cluster span{color:#333;}#mermaid-svg-U7vE62uXqjLTpXpE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-U7vE62uXqjLTpXpE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-U7vE62uXqjLTpXpE rect.text{fill:none;stroke-width:0;}#mermaid-svg-U7vE62uXqjLTpXpE .icon-shape,#mermaid-svg-U7vE62uXqjLTpXpE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U7vE62uXqjLTpXpE .icon-shape p,#mermaid-svg-U7vE62uXqjLTpXpE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-U7vE62uXqjLTpXpE .icon-shape .label rect,#mermaid-svg-U7vE62uXqjLTpXpE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U7vE62uXqjLTpXpE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-U7vE62uXqjLTpXpE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-U7vE62uXqjLTpXpE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
是
否
是
否
缓存命中率下降
命中率 < 85%?
正常范围
无需处理
10分钟内
下降超过15个百分点?
检查: 大容量刷缓存
或节点故障
热数据量
超过内存容量?
扩容 / 加节点
优化过期时间
调整业务代码
监控方式:
promql
# 命中率计算
sum(rate(redis_keyspace_hits_total[5m])) /
(sum(rate(redis_keyspace_hits_total[5m])) + sum(rate(redis_keyspace_misses_total[5m])))
两条实用告警:
- 命中率 < 85% 持续 10 分钟 → 需要检查内存和业务
- 命中率在 10 分钟内下降超过 15 个百分点 → 可能是大容量刷缓存或节点故障
4.3 Key 驱逐:内存不足的直接证据
当 Redis 内存达到 maxmemory 限制时,根据 maxmemory-policy 开始驱逐 Key。
#mermaid-svg-PWQhcLkAwyTysxVm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PWQhcLkAwyTysxVm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PWQhcLkAwyTysxVm .error-icon{fill:#552222;}#mermaid-svg-PWQhcLkAwyTysxVm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PWQhcLkAwyTysxVm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PWQhcLkAwyTysxVm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PWQhcLkAwyTysxVm .marker.cross{stroke:#333333;}#mermaid-svg-PWQhcLkAwyTysxVm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PWQhcLkAwyTysxVm p{margin:0;}#mermaid-svg-PWQhcLkAwyTysxVm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PWQhcLkAwyTysxVm .cluster-label text{fill:#333;}#mermaid-svg-PWQhcLkAwyTysxVm .cluster-label span{color:#333;}#mermaid-svg-PWQhcLkAwyTysxVm .cluster-label span p{background-color:transparent;}#mermaid-svg-PWQhcLkAwyTysxVm .label text,#mermaid-svg-PWQhcLkAwyTysxVm span{fill:#333;color:#333;}#mermaid-svg-PWQhcLkAwyTysxVm .node rect,#mermaid-svg-PWQhcLkAwyTysxVm .node circle,#mermaid-svg-PWQhcLkAwyTysxVm .node ellipse,#mermaid-svg-PWQhcLkAwyTysxVm .node polygon,#mermaid-svg-PWQhcLkAwyTysxVm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PWQhcLkAwyTysxVm .rough-node .label text,#mermaid-svg-PWQhcLkAwyTysxVm .node .label text,#mermaid-svg-PWQhcLkAwyTysxVm .image-shape .label,#mermaid-svg-PWQhcLkAwyTysxVm .icon-shape .label{text-anchor:middle;}#mermaid-svg-PWQhcLkAwyTysxVm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PWQhcLkAwyTysxVm .rough-node .label,#mermaid-svg-PWQhcLkAwyTysxVm .node .label,#mermaid-svg-PWQhcLkAwyTysxVm .image-shape .label,#mermaid-svg-PWQhcLkAwyTysxVm .icon-shape .label{text-align:center;}#mermaid-svg-PWQhcLkAwyTysxVm .node.clickable{cursor:pointer;}#mermaid-svg-PWQhcLkAwyTysxVm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PWQhcLkAwyTysxVm .arrowheadPath{fill:#333333;}#mermaid-svg-PWQhcLkAwyTysxVm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PWQhcLkAwyTysxVm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PWQhcLkAwyTysxVm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PWQhcLkAwyTysxVm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PWQhcLkAwyTysxVm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PWQhcLkAwyTysxVm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PWQhcLkAwyTysxVm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PWQhcLkAwyTysxVm .cluster text{fill:#333;}#mermaid-svg-PWQhcLkAwyTysxVm .cluster span{color:#333;}#mermaid-svg-PWQhcLkAwyTysxVm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PWQhcLkAwyTysxVm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PWQhcLkAwyTysxVm rect.text{fill:none;stroke-width:0;}#mermaid-svg-PWQhcLkAwyTysxVm .icon-shape,#mermaid-svg-PWQhcLkAwyTysxVm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PWQhcLkAwyTysxVm .icon-shape p,#mermaid-svg-PWQhcLkAwyTysxVm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PWQhcLkAwyTysxVm .icon-shape .label rect,#mermaid-svg-PWQhcLkAwyTysxVm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PWQhcLkAwyTysxVm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PWQhcLkAwyTysxVm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PWQhcLkAwyTysxVm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} allkeys-lru
volatile-lru
allkeys-lfu
noeviction
内存达到 maxmemory
maxmemory-policy?
驱逐最近最少使用的 Key
仅驱逐带过期时间的 Key
驱逐最不经常使用的 Key
不驱逐,返回 OOM 错误
⚠️ 全量扫描场景下
可能误驱逐热数据
✅ 推荐:只驱逐过期 Key
热数据不受影响
promql
# 驱逐速率(每秒)
rate(redis_evicted_keys_total[2m])
某应用 feed 流缓存,
maxmemory-policy设为allkeys-lru。活动期间访问量翻倍,驱逐速率飙到 200/秒,命中率从 90% 跌到 40%。解决方案是临时调大maxmemory并增加集群节点。
4.4 集群节点状态:发现"半死不活"的节点
Redis Cluster 最怕的不是节点彻底挂掉,而是节点"半死"------能响应 ping 但处理极慢,拖垮整个集群。
#mermaid-svg-01Iv0RNeXsuYMZEI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-01Iv0RNeXsuYMZEI .error-icon{fill:#552222;}#mermaid-svg-01Iv0RNeXsuYMZEI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-01Iv0RNeXsuYMZEI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-01Iv0RNeXsuYMZEI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-01Iv0RNeXsuYMZEI .marker.cross{stroke:#333333;}#mermaid-svg-01Iv0RNeXsuYMZEI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-01Iv0RNeXsuYMZEI p{margin:0;}#mermaid-svg-01Iv0RNeXsuYMZEI defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-01Iv0RNeXsuYMZEI g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-01Iv0RNeXsuYMZEI g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-01Iv0RNeXsuYMZEI g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-01Iv0RNeXsuYMZEI g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-01Iv0RNeXsuYMZEI g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-01Iv0RNeXsuYMZEI .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-01Iv0RNeXsuYMZEI .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-01Iv0RNeXsuYMZEI .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-01Iv0RNeXsuYMZEI .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-01Iv0RNeXsuYMZEI .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-01Iv0RNeXsuYMZEI .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-01Iv0RNeXsuYMZEI .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-01Iv0RNeXsuYMZEI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-01Iv0RNeXsuYMZEI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-01Iv0RNeXsuYMZEI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-01Iv0RNeXsuYMZEI .edgeLabel .label text{fill:#333;}#mermaid-svg-01Iv0RNeXsuYMZEI .label div .edgeLabel{color:#333;}#mermaid-svg-01Iv0RNeXsuYMZEI .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-01Iv0RNeXsuYMZEI .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-01Iv0RNeXsuYMZEI .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-01Iv0RNeXsuYMZEI .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-01Iv0RNeXsuYMZEI .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-01Iv0RNeXsuYMZEI .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-01Iv0RNeXsuYMZEI .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-01Iv0RNeXsuYMZEI #statediagram-barbEnd{fill:#333333;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-01Iv0RNeXsuYMZEI .cluster-label,#mermaid-svg-01Iv0RNeXsuYMZEI .nodeLabel{color:#131300;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-01Iv0RNeXsuYMZEI .note-edge{stroke-dasharray:5;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-note text{fill:black;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram-note .nodeLabel{color:black;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagram .edgeLabel{color:red;}#mermaid-svg-01Iv0RNeXsuYMZEI #dependencyStart,#mermaid-svg-01Iv0RNeXsuYMZEI #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-01Iv0RNeXsuYMZEI .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-01Iv0RNeXsuYMZEI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 节点正常
多数主节点标记 pfail
超时未恢复
节点恢复正常
人工介入修复
Healthy
Pfail
Fail
性能正常,槽位完整
能响应但性能受损(半死不活)
彻底下线,槽位迁移
promql
# 集群节点数变化
changes(redis_cluster_known_nodes[5m]) < 0
# 可能故障的节点数(pfail)
redis_cluster_slots_pfail > 0
# 已确认故障的槽位数
redis_cluster_slots_fail > 0
一条被忽视的指标:redis_cluster_slots_pfail。当一个节点被多数主节点标记为 pfail,但还没到 fail 阈值时,集群还能工作但性能已受损。对这个指标设一个 > 0 就告警的规则,能提前发现硬件或网络问题。
五、部署实战:三步搞定
5.1 创建 redis_exporter 部署文件
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cluster-exporter
spec:
replicas: 3
selector:
matchLabels:
app: redis-exporter
template:
metadata:
labels:
app: redis-exporter
spec:
containers:
- name: exporter
image: oliver006/redis_exporter:latest
args:
- --redis.addr=redis://redis-cluster:6379
- --redis.password=${REDIS_PASSWORD}
- --check-key-groups=user:*,order:*,cache:*
- --check-single-keys=config,blacklist
- --cluster-info # 开启集群信息采集
- --include-system-metrics # 开启系统指标
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-secret
key: password
ports:
- containerPort: 9121
name: metrics
关键参数说明:
| 参数 | 说明 |
|---|---|
--cluster-info |
采集集群拓扑和节点状态,集群模式下必须开启 |
--check-key-groups |
按前缀统计 Key 数量和大小的分布 |
--include-system-metrics |
额外采集 Redis 所在机器的 CPU/内存 |
5.2 Prometheus 采集配置
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: redis-exporter-monitor
spec:
selector:
matchLabels:
app: redis-exporter
endpoints:
- port: metrics
interval: 30s # Redis 指标变化相对慢,30 秒足够
scrapeTimeout: 10s
namespaceSelector:
matchNames:
- redis
5.3 验证指标是否到位
在 Prometheus UI 中执行:
promql
{__name__=~"redis_.*"}
看到 redis_memory_fragmentation_ratio、redis_evicted_keys_total、redis_cluster_known_nodes 等指标,说明采集成功。
六、告警规则全清单
#mermaid-svg-QfnI3hkwow38HzSV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QfnI3hkwow38HzSV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QfnI3hkwow38HzSV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QfnI3hkwow38HzSV .error-icon{fill:#552222;}#mermaid-svg-QfnI3hkwow38HzSV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QfnI3hkwow38HzSV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QfnI3hkwow38HzSV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QfnI3hkwow38HzSV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QfnI3hkwow38HzSV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QfnI3hkwow38HzSV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QfnI3hkwow38HzSV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QfnI3hkwow38HzSV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QfnI3hkwow38HzSV .marker.cross{stroke:#333333;}#mermaid-svg-QfnI3hkwow38HzSV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QfnI3hkwow38HzSV p{margin:0;}#mermaid-svg-QfnI3hkwow38HzSV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QfnI3hkwow38HzSV .cluster-label text{fill:#333;}#mermaid-svg-QfnI3hkwow38HzSV .cluster-label span{color:#333;}#mermaid-svg-QfnI3hkwow38HzSV .cluster-label span p{background-color:transparent;}#mermaid-svg-QfnI3hkwow38HzSV .label text,#mermaid-svg-QfnI3hkwow38HzSV span{fill:#333;color:#333;}#mermaid-svg-QfnI3hkwow38HzSV .node rect,#mermaid-svg-QfnI3hkwow38HzSV .node circle,#mermaid-svg-QfnI3hkwow38HzSV .node ellipse,#mermaid-svg-QfnI3hkwow38HzSV .node polygon,#mermaid-svg-QfnI3hkwow38HzSV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QfnI3hkwow38HzSV .rough-node .label text,#mermaid-svg-QfnI3hkwow38HzSV .node .label text,#mermaid-svg-QfnI3hkwow38HzSV .image-shape .label,#mermaid-svg-QfnI3hkwow38HzSV .icon-shape .label{text-anchor:middle;}#mermaid-svg-QfnI3hkwow38HzSV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QfnI3hkwow38HzSV .rough-node .label,#mermaid-svg-QfnI3hkwow38HzSV .node .label,#mermaid-svg-QfnI3hkwow38HzSV .image-shape .label,#mermaid-svg-QfnI3hkwow38HzSV .icon-shape .label{text-align:center;}#mermaid-svg-QfnI3hkwow38HzSV .node.clickable{cursor:pointer;}#mermaid-svg-QfnI3hkwow38HzSV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QfnI3hkwow38HzSV .arrowheadPath{fill:#333333;}#mermaid-svg-QfnI3hkwow38HzSV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QfnI3hkwow38HzSV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QfnI3hkwow38HzSV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QfnI3hkwow38HzSV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QfnI3hkwow38HzSV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QfnI3hkwow38HzSV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QfnI3hkwow38HzSV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QfnI3hkwow38HzSV .cluster text{fill:#333;}#mermaid-svg-QfnI3hkwow38HzSV .cluster span{color:#333;}#mermaid-svg-QfnI3hkwow38HzSV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QfnI3hkwow38HzSV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QfnI3hkwow38HzSV rect.text{fill:none;stroke-width:0;}#mermaid-svg-QfnI3hkwow38HzSV .icon-shape,#mermaid-svg-QfnI3hkwow38HzSV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QfnI3hkwow38HzSV .icon-shape p,#mermaid-svg-QfnI3hkwow38HzSV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QfnI3hkwow38HzSV .icon-shape .label rect,#mermaid-svg-QfnI3hkwow38HzSV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QfnI3hkwow38HzSV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QfnI3hkwow38HzSV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QfnI3hkwow38HzSV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是持续15分钟
否
是持续5分钟
否
是持续10分钟
否
是持续3分钟
否
是
否
是
否
Prometheus 告警评估
碎片率 > 1.8?
🔔 RedisFragmentationHigh
内存使用率 > 85%?
🔔 RedisMemoryUsageHigh
命中率 < 70%?
🔔 RedisHitRateLow
驱逐速率 > 100/秒?
🔔 RedisEvictionHigh
集群节点数减少?
🔔 RedisClusterNodeDown
存在故障槽位?
🔔 RedisClusterSlotFail
✅ 集群健康
yaml
groups:
- name: redis-high-availability
rules:
# 内存碎片率异常
- alert: RedisFragmentationHigh
expr: redis_memory_fragmentation_ratio > 1.8
for: 15m
annotations:
summary: "实例 {{ $labels.instance }} 碎片率 {{ $value }}"
# 内存使用率过高
- alert: RedisMemoryUsageHigh
expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.85
for: 5m
annotations:
summary: "内存使用率 {{ $value | humanizePercentage }}"
# 命中率过低
- alert: RedisHitRateLow
expr: |
sum(rate(redis_keyspace_hits_total[10m])) /
(sum(rate(redis_keyspace_hits_total[10m])) + sum(rate(redis_keyspace_misses_total[10m]))) < 0.7
for: 10m
annotations:
summary: "缓存命中率仅 {{ $value | humanizePercentage }}"
# Key 驱逐太快
- alert: RedisEvictionHigh
expr: rate(redis_evicted_keys_total[5m]) > 100
for: 3m
annotations:
summary: "驱逐速率 {{ $value }}/秒,内存严重不足"
# 集群节点掉线
- alert: RedisClusterNodeDown
expr: redis_cluster_known_nodes < 3
for: 1m
annotations:
summary: "集群节点数不足,仅剩 {{ $value }} 个"
# 集群有故障槽位
- alert: RedisClusterSlotFail
expr: redis_cluster_slots_fail > 0
for: 0m
annotations:
summary: "集群有 {{ $value }} 个槽位故障"
# 慢查询堆积
- alert: RedisSlowLog堆积
expr: redis_slowlog_length > 10
for: 5m
annotations:
summary: "慢查询队列有 {{ $value }} 条未处理"
七、一次真实故障复盘
7.1 背景
电商平台 Redis Cluster,6 节点,每个节点 8GB 内存。
7.2 故障现象
- 业务反馈接口响应从 20ms 涨到 200ms
- 缓存命中率从 92% 降到 67%
- MySQL CPU 飙到 75%(因为缓存失效)
7.3 根因分析流程
#mermaid-svg-hppXTsNmeQGWLhtb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hppXTsNmeQGWLhtb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hppXTsNmeQGWLhtb .error-icon{fill:#552222;}#mermaid-svg-hppXTsNmeQGWLhtb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hppXTsNmeQGWLhtb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hppXTsNmeQGWLhtb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hppXTsNmeQGWLhtb .marker.cross{stroke:#333333;}#mermaid-svg-hppXTsNmeQGWLhtb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hppXTsNmeQGWLhtb p{margin:0;}#mermaid-svg-hppXTsNmeQGWLhtb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hppXTsNmeQGWLhtb .cluster-label text{fill:#333;}#mermaid-svg-hppXTsNmeQGWLhtb .cluster-label span{color:#333;}#mermaid-svg-hppXTsNmeQGWLhtb .cluster-label span p{background-color:transparent;}#mermaid-svg-hppXTsNmeQGWLhtb .label text,#mermaid-svg-hppXTsNmeQGWLhtb span{fill:#333;color:#333;}#mermaid-svg-hppXTsNmeQGWLhtb .node rect,#mermaid-svg-hppXTsNmeQGWLhtb .node circle,#mermaid-svg-hppXTsNmeQGWLhtb .node ellipse,#mermaid-svg-hppXTsNmeQGWLhtb .node polygon,#mermaid-svg-hppXTsNmeQGWLhtb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hppXTsNmeQGWLhtb .rough-node .label text,#mermaid-svg-hppXTsNmeQGWLhtb .node .label text,#mermaid-svg-hppXTsNmeQGWLhtb .image-shape .label,#mermaid-svg-hppXTsNmeQGWLhtb .icon-shape .label{text-anchor:middle;}#mermaid-svg-hppXTsNmeQGWLhtb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hppXTsNmeQGWLhtb .rough-node .label,#mermaid-svg-hppXTsNmeQGWLhtb .node .label,#mermaid-svg-hppXTsNmeQGWLhtb .image-shape .label,#mermaid-svg-hppXTsNmeQGWLhtb .icon-shape .label{text-align:center;}#mermaid-svg-hppXTsNmeQGWLhtb .node.clickable{cursor:pointer;}#mermaid-svg-hppXTsNmeQGWLhtb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hppXTsNmeQGWLhtb .arrowheadPath{fill:#333333;}#mermaid-svg-hppXTsNmeQGWLhtb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hppXTsNmeQGWLhtb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hppXTsNmeQGWLhtb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hppXTsNmeQGWLhtb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hppXTsNmeQGWLhtb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hppXTsNmeQGWLhtb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hppXTsNmeQGWLhtb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hppXTsNmeQGWLhtb .cluster text{fill:#333;}#mermaid-svg-hppXTsNmeQGWLhtb .cluster span{color:#333;}#mermaid-svg-hppXTsNmeQGWLhtb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hppXTsNmeQGWLhtb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hppXTsNmeQGWLhtb rect.text{fill:none;stroke-width:0;}#mermaid-svg-hppXTsNmeQGWLhtb .icon-shape,#mermaid-svg-hppXTsNmeQGWLhtb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hppXTsNmeQGWLhtb .icon-shape p,#mermaid-svg-hppXTsNmeQGWLhtb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hppXTsNmeQGWLhtb .icon-shape .label rect,#mermaid-svg-hppXTsNmeQGWLhtb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hppXTsNmeQGWLhtb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hppXTsNmeQGWLhtb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hppXTsNmeQGWLhtb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ROOT
节点存储大量频繁更新的 JSON
内存分配回收产生大量碎片
有效内存 8GB → 4GB
触发 Key 驱逐
驱逐消耗 CPU,形成恶性循环
接口响应 20ms → 200ms
查看缓存命中率
92% → 67%
查看碎片率趋势
一个节点 1.1 → 2.4(持续两周)
查看驱逐速率
达到 180/秒
查看集群状态
该节点 slots_pfail = 1
| 指标 | 数据 |
|---|---|
| 碎片率趋势图 | 一个节点碎片率从 1.1 爬升到 2.4,持续了两周 |
| 驱逐速率 | 故障期间达到 180/秒 |
| 集群状态 | 该节点的 redis_cluster_slots_pfail 为 1,其他节点认为它"可能挂了" |
根因:该节点存储了大量频繁更新的 JSON 对象,内存分配回收产生大量碎片。碎片导致有效内存缩水到 4GB,触发驱逐,驱逐又消耗 CPU,形成恶性循环。
7.4 解决方案
#mermaid-svg-iTanch4uKdhDUYKF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iTanch4uKdhDUYKF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iTanch4uKdhDUYKF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iTanch4uKdhDUYKF .error-icon{fill:#552222;}#mermaid-svg-iTanch4uKdhDUYKF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iTanch4uKdhDUYKF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iTanch4uKdhDUYKF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iTanch4uKdhDUYKF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iTanch4uKdhDUYKF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iTanch4uKdhDUYKF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iTanch4uKdhDUYKF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iTanch4uKdhDUYKF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iTanch4uKdhDUYKF .marker.cross{stroke:#333333;}#mermaid-svg-iTanch4uKdhDUYKF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iTanch4uKdhDUYKF p{margin:0;}#mermaid-svg-iTanch4uKdhDUYKF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iTanch4uKdhDUYKF .cluster-label text{fill:#333;}#mermaid-svg-iTanch4uKdhDUYKF .cluster-label span{color:#333;}#mermaid-svg-iTanch4uKdhDUYKF .cluster-label span p{background-color:transparent;}#mermaid-svg-iTanch4uKdhDUYKF .label text,#mermaid-svg-iTanch4uKdhDUYKF span{fill:#333;color:#333;}#mermaid-svg-iTanch4uKdhDUYKF .node rect,#mermaid-svg-iTanch4uKdhDUYKF .node circle,#mermaid-svg-iTanch4uKdhDUYKF .node ellipse,#mermaid-svg-iTanch4uKdhDUYKF .node polygon,#mermaid-svg-iTanch4uKdhDUYKF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iTanch4uKdhDUYKF .rough-node .label text,#mermaid-svg-iTanch4uKdhDUYKF .node .label text,#mermaid-svg-iTanch4uKdhDUYKF .image-shape .label,#mermaid-svg-iTanch4uKdhDUYKF .icon-shape .label{text-anchor:middle;}#mermaid-svg-iTanch4uKdhDUYKF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iTanch4uKdhDUYKF .rough-node .label,#mermaid-svg-iTanch4uKdhDUYKF .node .label,#mermaid-svg-iTanch4uKdhDUYKF .image-shape .label,#mermaid-svg-iTanch4uKdhDUYKF .icon-shape .label{text-align:center;}#mermaid-svg-iTanch4uKdhDUYKF .node.clickable{cursor:pointer;}#mermaid-svg-iTanch4uKdhDUYKF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iTanch4uKdhDUYKF .arrowheadPath{fill:#333333;}#mermaid-svg-iTanch4uKdhDUYKF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iTanch4uKdhDUYKF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iTanch4uKdhDUYKF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iTanch4uKdhDUYKF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iTanch4uKdhDUYKF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iTanch4uKdhDUYKF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iTanch4uKdhDUYKF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iTanch4uKdhDUYKF .cluster text{fill:#333;}#mermaid-svg-iTanch4uKdhDUYKF .cluster span{color:#333;}#mermaid-svg-iTanch4uKdhDUYKF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iTanch4uKdhDUYKF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iTanch4uKdhDUYKF rect.text{fill:none;stroke-width:0;}#mermaid-svg-iTanch4uKdhDUYKF .icon-shape,#mermaid-svg-iTanch4uKdhDUYKF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iTanch4uKdhDUYKF .icon-shape p,#mermaid-svg-iTanch4uKdhDUYKF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iTanch4uKdhDUYKF .icon-shape .label rect,#mermaid-svg-iTanch4uKdhDUYKF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iTanch4uKdhDUYKF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iTanch4uKdhDUYKF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iTanch4uKdhDUYKF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 长期措施
临时措施
立即重启该节点
恢复内存布局
开启 activedefrag
自动整理碎片
大 JSON 拆散为 Hash
减少内存分配波动
碎片率稳定在 1.2 以下 ✅
八、三个最容易踩的坑
#mermaid-svg-Gs5qbaJGIhROwv3k{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Gs5qbaJGIhROwv3k .error-icon{fill:#552222;}#mermaid-svg-Gs5qbaJGIhROwv3k .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Gs5qbaJGIhROwv3k .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Gs5qbaJGIhROwv3k .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Gs5qbaJGIhROwv3k .marker.cross{stroke:#333333;}#mermaid-svg-Gs5qbaJGIhROwv3k svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Gs5qbaJGIhROwv3k p{margin:0;}#mermaid-svg-Gs5qbaJGIhROwv3k .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k .cluster-label text{fill:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k .cluster-label span{color:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k .cluster-label span p{background-color:transparent;}#mermaid-svg-Gs5qbaJGIhROwv3k .label text,#mermaid-svg-Gs5qbaJGIhROwv3k span{fill:#333;color:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k .node rect,#mermaid-svg-Gs5qbaJGIhROwv3k .node circle,#mermaid-svg-Gs5qbaJGIhROwv3k .node ellipse,#mermaid-svg-Gs5qbaJGIhROwv3k .node polygon,#mermaid-svg-Gs5qbaJGIhROwv3k .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Gs5qbaJGIhROwv3k .rough-node .label text,#mermaid-svg-Gs5qbaJGIhROwv3k .node .label text,#mermaid-svg-Gs5qbaJGIhROwv3k .image-shape .label,#mermaid-svg-Gs5qbaJGIhROwv3k .icon-shape .label{text-anchor:middle;}#mermaid-svg-Gs5qbaJGIhROwv3k .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Gs5qbaJGIhROwv3k .rough-node .label,#mermaid-svg-Gs5qbaJGIhROwv3k .node .label,#mermaid-svg-Gs5qbaJGIhROwv3k .image-shape .label,#mermaid-svg-Gs5qbaJGIhROwv3k .icon-shape .label{text-align:center;}#mermaid-svg-Gs5qbaJGIhROwv3k .node.clickable{cursor:pointer;}#mermaid-svg-Gs5qbaJGIhROwv3k .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Gs5qbaJGIhROwv3k .arrowheadPath{fill:#333333;}#mermaid-svg-Gs5qbaJGIhROwv3k .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Gs5qbaJGIhROwv3k .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Gs5qbaJGIhROwv3k .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gs5qbaJGIhROwv3k .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Gs5qbaJGIhROwv3k .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gs5qbaJGIhROwv3k .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Gs5qbaJGIhROwv3k .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Gs5qbaJGIhROwv3k .cluster text{fill:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k .cluster span{color:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Gs5qbaJGIhROwv3k .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Gs5qbaJGIhROwv3k rect.text{fill:none;stroke-width:0;}#mermaid-svg-Gs5qbaJGIhROwv3k .icon-shape,#mermaid-svg-Gs5qbaJGIhROwv3k .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gs5qbaJGIhROwv3k .icon-shape p,#mermaid-svg-Gs5qbaJGIhROwv3k .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Gs5qbaJGIhROwv3k .icon-shape .label rect,#mermaid-svg-Gs5qbaJGIhROwv3k .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gs5qbaJGIhROwv3k .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Gs5qbaJGIhROwv3k .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Gs5qbaJGIhROwv3k :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 坑3: maxmemory-policy 误配
allkeys-lru + 全量扫描
热数据被驱逐
坑2: 忽略复制缓冲区
只看 seconds_behind_master = 0
以为同步正常
忽略 repl_backlog_size
被写满导致全量复制
坑1: used_memory_rss 误判
只看 used_memory_rss = 8GB
以为内存充足
忽略碎片率 2.0
有效内存仅 4GB
8.1 坑 1:把 used_memory_rss 当成真实内存使用
used_memory_rss 包含碎片,一个碎片率 2.0 的节点,8GB 物理内存中只有 4GB 存了有效数据。监控内存应该同时看使用量和碎片率。
8.2 坑 2:只看 seconds_behind_master 忽略复制缓冲区
主从架构中,从库延迟为 0 不代表同步健康。还要看 redis_master_repl_offset 和 redis_slave_repl_offset 的差值,以及 redis_repl_backlog_size 是否被写满。
8.3 坑 3:对 maxmemory-policy 配置盲目信任
allkeys-lru 在内存满时会驱逐最近最少使用的 Key。但如果访问模式是"全量扫描",LRU 会驱逐真正的热数据。建议用 volatile-lru 只驱逐设置了过期时间的 Key。
九、总结
Redis"活着"不等于"健康地活着"。
#mermaid-svg-fkHObIsNblAnzc3P{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fkHObIsNblAnzc3P .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fkHObIsNblAnzc3P .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fkHObIsNblAnzc3P .error-icon{fill:#552222;}#mermaid-svg-fkHObIsNblAnzc3P .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fkHObIsNblAnzc3P .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fkHObIsNblAnzc3P .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fkHObIsNblAnzc3P .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fkHObIsNblAnzc3P .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fkHObIsNblAnzc3P .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fkHObIsNblAnzc3P .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fkHObIsNblAnzc3P .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fkHObIsNblAnzc3P .marker.cross{stroke:#333333;}#mermaid-svg-fkHObIsNblAnzc3P svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fkHObIsNblAnzc3P p{margin:0;}#mermaid-svg-fkHObIsNblAnzc3P .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fkHObIsNblAnzc3P .cluster-label text{fill:#333;}#mermaid-svg-fkHObIsNblAnzc3P .cluster-label span{color:#333;}#mermaid-svg-fkHObIsNblAnzc3P .cluster-label span p{background-color:transparent;}#mermaid-svg-fkHObIsNblAnzc3P .label text,#mermaid-svg-fkHObIsNblAnzc3P span{fill:#333;color:#333;}#mermaid-svg-fkHObIsNblAnzc3P .node rect,#mermaid-svg-fkHObIsNblAnzc3P .node circle,#mermaid-svg-fkHObIsNblAnzc3P .node ellipse,#mermaid-svg-fkHObIsNblAnzc3P .node polygon,#mermaid-svg-fkHObIsNblAnzc3P .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fkHObIsNblAnzc3P .rough-node .label text,#mermaid-svg-fkHObIsNblAnzc3P .node .label text,#mermaid-svg-fkHObIsNblAnzc3P .image-shape .label,#mermaid-svg-fkHObIsNblAnzc3P .icon-shape .label{text-anchor:middle;}#mermaid-svg-fkHObIsNblAnzc3P .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fkHObIsNblAnzc3P .rough-node .label,#mermaid-svg-fkHObIsNblAnzc3P .node .label,#mermaid-svg-fkHObIsNblAnzc3P .image-shape .label,#mermaid-svg-fkHObIsNblAnzc3P .icon-shape .label{text-align:center;}#mermaid-svg-fkHObIsNblAnzc3P .node.clickable{cursor:pointer;}#mermaid-svg-fkHObIsNblAnzc3P .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fkHObIsNblAnzc3P .arrowheadPath{fill:#333333;}#mermaid-svg-fkHObIsNblAnzc3P .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fkHObIsNblAnzc3P .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fkHObIsNblAnzc3P .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fkHObIsNblAnzc3P .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fkHObIsNblAnzc3P .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fkHObIsNblAnzc3P .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fkHObIsNblAnzc3P .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fkHObIsNblAnzc3P .cluster text{fill:#333;}#mermaid-svg-fkHObIsNblAnzc3P .cluster span{color:#333;}#mermaid-svg-fkHObIsNblAnzc3P div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fkHObIsNblAnzc3P .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fkHObIsNblAnzc3P rect.text{fill:none;stroke-width:0;}#mermaid-svg-fkHObIsNblAnzc3P .icon-shape,#mermaid-svg-fkHObIsNblAnzc3P .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fkHObIsNblAnzc3P .icon-shape p,#mermaid-svg-fkHObIsNblAnzc3P .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fkHObIsNblAnzc3P .icon-shape .label rect,#mermaid-svg-fkHObIsNblAnzc3P .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fkHObIsNblAnzc3P .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fkHObIsNblAnzc3P .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fkHObIsNblAnzc3P :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 三条黄金法则
① 碎片率 > 1.5 就要介入
早期信号,别等到 3.0
② 命中率下降 + 驱逐上升 = 内存不够
加内存或扩容集群
③ 节点数不变但性能下降
去看 pfail 指标
主动重启 / 开启 activedefrag
扩容 / 增加节点
定位半死不活的节点
监控不是目的,提前发现问题才是。
方案落地后,我们团队再也没有出现过"Redis 没挂但缓存炸了"的故障。碎片率告警让他们在大促前主动重启了问题节点,命中率趋势图帮他们发现了业务代码中的一次全表缓存刷新操作。