Redis 作为高性能内存数据库,其监控体系是保障业务连续性的生命线。完善的监控需覆盖性能、资源、连接、持久化、集群五大维度,配合主动告警+自动恢复机制,实现从"看得见"到"管得住"的闭环
核心监控指标全景图
1. 性能指标(P0 - 直接影响用户体验)
| 指标 | 采集命令 | 健康阈值 | 告警阈值 | 影响说明 |
|---|---|---|---|---|
| QPS | INFO stats→instantaneous_ops_per_sec | < 5万 | > 10万 | 超过单实例性能上限,延迟飙升 |
| 平均延迟 | SLOWLOG GET/LATENCY LATEST | < 1ms | > 10ms | 用户感知卡顿,业务超时 |
| 慢查询数量 | SLOWLOG LEN | < 100 | > 1000 | 大key或复杂命令阻塞 |
| 命令执行时间 | SLOWLOG GET | < 10ms | > 100ms | 定位具体慢命令 |
实战采集代码:
// Java 定时任务采集性能指标(每10秒)[⁸⁹]Jedisjedis=newJedis(REDIS_HOST,REDIS_PORT);Stringinfo=jedis.info("stats");Map<String,String>stats=parseInfo(info);intqps=Integer.parseInt(stats.get("instantaneous_ops_per_sec"));longslowlogLen=jedis.slowlogLen();问题定位:
- QPS 突增:业务流量暴涨 or 缓存穿透导致大量请求打到 Redis
- 延迟飙升:BigKey 操作、AOF 重写、RDB 快照、网络抖动
2. 资源利用指标(P0 - 决定系统稳定性)
| 指标 | 采集命令 | 健康阈值 | 危险阈值 | 应对方案 |
|---|---|---|---|---|
| 内存使用率 | INFO memory→used_memory_rss/maxmemory | < 70% | > 90% | 扩容 or 淘汰策略优化 |
| 内存碎片率 | used_memory_rss/used_memory | 1.0-1.5 | > 2.0 | 重启 orMEMORY PURGE |
| CPU 使用率 | INFO cpu→used_cpu_sys/used_cpu_user | < 60% | > 80% | 排查慢查询、优化命令 |
| 网络输入/输出流量 | INFO stats→total_net_input_bytes | < 500MB/s | > 1GB/s | 压缩 value or 减少批量操作 |
关键指标详解:
内存占用used_memory_human:Redis 数据占用的内存大小(不含碎片)
- 风险:超过 maxmemory 触发淘汰 or OOM
- 优化:设置 maxmemory-policy allkeys-lru,监控大 key
内存峰值used_memory_peak:历史最大内存占用
- 用途:评估 maxmemory 设置是否合理
碎片率mem_fragmentation_ratio:
- 1.0-1.5:健康
- 大于1.5 :存在碎片,频繁更新删除导致
- 大于2.0:严重碎片,建议重启 or MEMORY PURGE(4.0+)
大 key 监控:
# 命令行扫描大 key(生产环境慎用) redis-cli--bigkeys # 推荐:用 MEMORY USAGE 采样 MEMORY USAGE user:1001# 返回字节数3. 连接状态指标(P1 - 服务可用性)
| 指标 | 采集命令 | 阈值 | 问题场景 |
|---|---|---|---|
| 客户端连接数 | INFO clients→connected_clients | < 5000 | >maxclients导致新连接被拒 |
| 阻塞客户端数 | blocked_clients | < 10 | BLPOP/BRPOP长时间阻塞 |
| 拒绝连接数 | rejected_connections | 0 | > 0 说明已达最大连接数 |
连接数突增排查:
- 连接池泄漏(未归还)
- 业务代码循环创建连接
- 网络分区导致客户端重连风暴
应对:
# 调整最大连接数 maxclients10000# 设置连接超时,避免空闲连接堆积 timeout3004. 持久化指标(P1 - 数据安全)
| 指标 | 采集方式 | 健康状态 | 告警规则 |
|---|---|---|---|
| RDB 最后一次成功时间 | INFO persistence→rdb_last_save_time | < 3600s | > 86400s(1天未备份) |
| AOF 重写状态 | aof_rewrite_in_progress | 0 | = 1(持续 > 10分钟) |
| AOF 缓冲区大小 | aof_buffer_length | < 10MB | > 100MB(写入过快) |
| 主从复制延迟(Offset) | master_repl_offset-slave_repl_offset | < 1MB | > 10MB(延迟严重) |
主从延迟监控:
# 在Slave上执行 INFO replication # 指标:master_link_status:up,slave_repl_offset,master_repl_offset # 计算延迟字节数 delay=master_repl_offset-slave_repl_offset延迟原因与解决:
- 网络带宽:升级带宽 or 压缩传输(repl-diskless-sync yes)
- Slave 性能:Slave 配置低,处理慢 → 提升 Slave 配置
- 大 key:主节点删除大 key,生成 RDB 慢 → 拆分大 key
5. 键空间指标(P2 - 业务健康度)
| 指标 | 采集命令 | 业务含义 | 优化建议 |
|---|---|---|---|
| Key 总数 | INFO keyspace→db0:keys=100000 | 增长趋势 | 设置 TTL 或定期清理 |
| 过期 key 数量 | expired_keys | 活跃度 | 监控过期速率 |
| Key 命中率 | keyspace_hits/ (hits+misses) | 缓存效率 | > 95% 为健康 |
| 淘汰 key 数量 | evicted_keys | 内存压力 | > 0 说明内存不足 |
命中率计算:
longhits=Long.parseLong(stats.get("keyspace_hits"));longmisses=Long.parseLong(stats.get("keyspace_misses"));doublehitRate=(double)hits/(hits+misses)*100;// 告警:hitRate < 90%命中率低的原因:
- 缓存穿透(查询不存在的数据):布隆过滤器拦截
- 缓存雪崩(大量 key 同时过期):过期时间加随机值
- 缓存击穿(热点 key 过期):互斥锁重建缓存
6. 集群健康指标(P1 - 分布式场景)
| 指标 | 采集命令 | 正常值 | 告警场景 |
|---|---|---|---|
| 主节点数 | CLUSTER INFO→cluster_known_nodes | = 预期节点数 | 节点下线 |
| 失败槽位数 | cluster_slots_fail | 0 | > 0(部分数据不可访问) |
| 主从同步延迟 | master_link_status | up | down |
| 正在迁移的槽位数 | cluster_slots_pfail | 0 | > 0(扩容迁移中) |
二、监控工具选型与集成
工具 1:Redis 原生命令(轻量级)
适用场景:快速诊断、脚本化监控
# 实时性能监控redis-cli INFO[section]# section: server, clients, memory, stats, replication, cpu, keyspace, cluster# 慢查询日志CONFIG SET slowlog-log-slower-than10000# 记录 >10ms 的命令SLOWLOG GET10# 获取最近10条慢查询# 延迟诊断redis-cli --latency-history -i100# 每100ms采样延迟# 实时监控命令redis-cli MONITOR# 高开销,仅用于调试优缺点:
✅ 零依赖,开箱即用
❌ 数据不持久化,无可视化,无法告警
工具 2:RedisInsight(官方可视化)
官网:https://redis.com/redis-enterprise/redis-insight/
核心功能:
- 实时监控:QPS、内存、CPU、连接数仪表盘
- 慢查询分析:图形化展示慢命令排行榜
- 大 Key 检测:扫描并展示 Top 100 BigKey
- 数据浏览:CRUD 操作,支持多种数据结构
- 配置优化建议:基于当前负载给出 redis.conf 优化建议
部署:
docker run -d -p8001:8001 redislabs/redisinsight优缺点:
✅ 功能全面,官方支持,免费
❌ 资源消耗较高(需 1GB+ 内存)
❌ 不支持多实例集中监控(需部署多个)
工具 3:Prometheus + Grafana(企业级标准)
架构:
Redis → Redis Exporter → Prometheus → Grafana → 告警(AlertManager)
部署 Redis Exporter:
docker run -d --name redis-exporter\-p9121:9121\oliver006/redis_exporter\--redis.addr=redis://192.168.1.101:6379\--redis.password=your_passwordPrometheus 配置(yaml):
scrape_configs:-job_name:'redis'static_configs:-targets:['192.168.1.101:9121']Grafana 仪表盘:
- 导入模板:https://grafana.com/grafana/dashboards/763(官方 Redis 模板)
- 核心图表:
- QPS 趋势图
- 内存使用率 + 碎片率
- 命中率
- 主从复制延迟
- 慢查询数量
告警规则(Prometheus):
yaml
groups:-name:redisrules:-alert:RedisDownexpr:up{job="redis"}== 0for:1mlabels:severity:criticalannotations:summary:"Redis {{ $labels.instance }} down"-alert:RedisMemoryHighexpr:redis_memory_used_bytes / redis_memory_max_bytes>0.9for:5mlabels:severity:warningannotations:summary:"Redis memory usage > 90%"-alert:RedisSlowLogexpr:increase(redis_slowlog_length[5m])>10labels:severity:warningannotations:summary:"Redis slow query increased"优缺点:
✅ 生产级标准:支持大规模集群、长期存储、灵活告警
✅ 生态完善:与 Kubernetes、AlertManager 无缝集成
❌ 部署复杂:需维护 Prometheus、Grafana、Exporter 三套组件
工具 4:Another Redis Desktop Manager(运维利器)
GitHub:https://github.com/qishibo/AnotherRedisDesktopManager
特点:
- 开源免费:GitHub 20k+ star
- SSH 隧道:支持跳板机连接
- Dark Mode:程序员友好
- 大 Key 分析:内置扫描功能
- 命令行模式:支持 Redis CLI
适用场景:日常运维、开发调试
三、告警规则配置实战
一级告警(Critical)- 立即处理
-alert:RedisDownexpr:up{job="redis"}== 0for:1mlabels:severity:criticalchannel:phone# 电话告警annotations:summary:"Redis 实例 {{ $labels.instance }} 宕机"runbook:"1. 检查 Redis 进程 2. 查看系统日志 3. 执行故障转移"-alert:RedisMemoryCriticalexpr:redis_memory_used_bytes / redis_memory_max_bytes>0.95for:3mlabels:severity:criticalannotations:summary:"Redis 内存使用率 > 95%,可能触发 OOM"action:"1. 检查大 key 2. 清理过期 key 3. 紧急扩容"二级告警(Warning)- 4 小时内处理
-alert:RedisSlowQueryexpr:rate(redis_slowlog_length[5m])>5# 5 分钟新增 5 条慢查询for:10mlabels:severity:warningannotations:summary:"Redis 慢查询增多"action:"查看慢查询日志,优化命令或大 key"-alert:RedisReplicationLagexpr:redis_master_repl_offset-redis_slave_repl_offset>1048576# 1MB 延迟for:5mlabels:severity:warningannotations:summary:"主从同步延迟过大"action:"检查网络带宽、Slave 性能、是否有大 key"三级告警(Info)- 24 小时内处理
-alert:RedisHitRateLowexpr:redis_keyspace_hits / (redis_keyspace_hits + redis_keyspace_misses) < 0.8for:1hlabels:severity:infoannotations:summary:"Redis 命中率低于 80%"suggestion:"检查业务逻辑,优化缓存策略,避免缓存穿透"四、常见问题应对方案
问题 1:Redis 内存耗尽(OOM)
现象:used_memory > maxmemory,写入报错 OOM command not allowed
告警配置:
expr:redis_memory_used_bytes / redis_memory_max_bytes>0.9应对方案(按优先级):
1.紧急处理:
# 1. 排查大 key(立即释放)redis-cli --bigkeys# 删除大 key(慎用,会阻塞)DEL bigkey# 2. 调整淘汰策略(允许淘汰)CONFIG SET maxmemory-policy allkeys-lru# 3. 临时增加 maxmemory(物理内存足够时)CONFIG SET maxmemory 8gb2.短期优化:
- 拆分大 key:Hash/List 拆分为多个小 key
- 设置 TTL:非热点 key 自动过期
- 使用内存压缩:启用 list-max-ziplist-size 等编码优化
3.长期规划:
- 垂直扩容:升级服务器内存
- 水平扩容:Cluster 分片,分散数据
- 冷热分离:冷数据迁移到 SSD(Redis on Flash)
问题 2:缓存雪崩(大量 key 同时过期)
现象:QPS 突增,数据库压力剧增,响应延迟飙升
监控指标:
expr:increase(redis_expired_keys[1m])>10000# 1 分钟过期超过 1 万个应对方案:
- 1.过期时间加随机值:
// 设置 TTL 时 + 随机值intttl=3600+newRandom().nextInt(300);// 3600-3900 秒redis.setex(key,ttl,value);- 2.互斥锁重建缓存
StringgetWithRebuild(Stringkey){Stringvalue=redis.get(key);if(value==null){// 获取互斥锁if(redis.setnx("lock:"+key,"1")){redis.expire("lock:"+key,30);value=db.query();// 查询数据库redis.setex(key,3600,value);redis.del("lock:"+key);}else{Thread.sleep(100);returngetWithRebuild(key);// 重试}}returnvalue;}- 3.提前预热:在业务低峰期主动加载热点数据
问题 3:缓存穿透(查询不存在的数据)
现象:缓存命中率极低(< 50%),数据库压力持续高位
监控指标:
expr:redis_keyspace_misses / (redis_keyspace_hits + redis_keyspace_misses)>0.5应对方案:
- 布隆过滤器
RBloomFilter<String>bloomFilter=redisson.getBloomFilter("bloom:product");bloomFilter.tryInit(1000000,0.01);// 查询时先查布隆过滤器if(!bloomFilter.contains(productId)){returnnull;// 一定不存在}// 再查询缓存和数据库- 缓存空值
Stringvalue=db.query(productId);if(value==null){redis.setex(productId,60,"NULL");// 缓存空值,防止重复查询}问题 4:主从同步延迟
现象:从节点数据落后主节点,读请求读到旧数据
监控指标:
expr:redis_master_repl_offset-redis_slave_repl_offset>10485760# 10MB 延迟应对方案:
- 诊断
# 在 Slave 上执行INFO replication# 查看:master_last_io_seconds_ago(主从最后通信时间)# 查看:slave_repl_offset 与主节点对比- 优化
- 升级网络带宽(建议 10Gbps)
- 提升 Slave 配置(与 Master 同规格)
- 减少大 key:repl-timeout 默认 60 秒,大 key 传输超时
- 开启无盘复制:repl-diskless-sync yes(减少主节点磁盘 IO)
问题 5:慢查询阻塞
现象:某些命令执行时间 > 100ms,导致 Redis 阻塞
监控配置:
# redis.conf slowlog-log-slower-than 10000 # 记录 >10ms 的命令 slowlog-max-len 1000 # 保留最近 1000 条告警:
expr:increase(redis_slowlog_length[5m])>10应对方案:
- 1.定位慢查询
redis-cli SLOWLOG GET10# 输出:ID、时间戳、执行时长(微秒)、命令及参数- 2.优化
- 大 key 拆分:DEL 100万元素的List → LTRIM 分批删除
- 复杂命令禁用:生产环境禁用 KEYS *、FLUSHALL、EVAL 大量数据
- 使用 Pipeline:批量操作减少 RTT
- 缩短慢查询阈值:CONFIG SET slowlog-log-slower-than 5000
问题 6:Redis Cluster 槽位故障
现象:cluster_slots_fail > 0,部分数据不可访问
监控指标:
expr:redis_cluster_slots_fail>0应对方案:
- 1.定位故障节点
redis-cli CLUSTER NODES# 查看节点状态:fail?、disconnected?- 自动恢复
- Sentinel 会自动提升 Slave 为 Master
- 手动修复:重启故障节点,执行 CLUSTER MEET 重新加入集群
- 预防
- 每个 Master 至少 1 个 Slave
- 跨机架部署,避免单机架故障
- 设置 cluster-require-full-coverage no(允许部分槽位故障)
五、运维最佳实践
1. 监控覆盖率要求
- 100% 实例覆盖:所有 Redis 实例(包括测试环境)接入监控
- 7x24 小时监控:保留 30 天历史数据,支持趋势分析
- 秒级采集:核心指标(QPS、内存)采集频率 ≤ 10 秒
2. 告警分级响应
| 级别 | 响应时间 | 通知方式 | 处理人 |
|---|---|---|---|
| Critical | 5 分钟内 | 电话 + 短信 + 邮件 | 值班运维 + 架构师 |
| Warning | 30 分钟内 | 短信 + 邮件 + 企业微信 | 值班运维 |
| Info | 4 小时内 | 邮件 | 运维 |
3. 监控与业务联动
// 业务代码嵌入监控埋点publicvoidcreateOrder(Orderorder){longstart=System.currentTimeMillis();try{redis.setex("order:"+order.getId(),3600,JSON.toJSONString(order));Metrics.timer("redis.setex.duration",System.currentTimeMillis()-start);}catch(Exceptione){Metrics.counter("redis.setex.errors").increment();throwe;}}4. 定期健康检查
# 每周执行redis-cli INFO ALL>redis_health_$(date+%Y%m%d).log redis-cli --latency-history -i100>latency_report.log redis-cli SLOWLOG RESET# 重置慢查询日志# 分析报告检查:内存使用率、命中率、主从延迟、慢查询数量六、一句话总结
Redis 监控体系 = 核心指标全采集 + Prometheus 持久化 + Grafana 可视化 + 分级精准告警 + 自动化应对方案。记住:监控不是为了好看,而是为了在故障发生前尽早发现问题,在故障发生后尽快恢复服务。从 QPS、内存、命中率这 3 个黄金指标开始,逐步完善你的监控版图