Redis 如何进行监控和运维?
Redis 监控和运维是保障线上稳定性的核心能力,面试中常从"监控哪些指标""用什么工具""遇到问题怎么排查"三个角度考察。
关键监控指标
内存指标
内存是 Redis 最核心的资源,重点监控以下项:
bashINFO memory # 关键字段 used_memory # Redis 分配器分配的内存 used_memory_rss # 操作系统实际分配的内存 mem_fragmentation_ratio # 内存碎片率 = used_memory_rss / used_memory maxmemory # 配置的最大内存限制
碎片率阈值解读:碎片率 > 1.5 说明碎片严重,需触发 MEMORY PURGE 或重启;碎片率 < 1.0 说明使用了 Swap,性能会急剧下降,应立即排查。
命中率直接反映缓存有效性:
bashkeyspace_hits / (keyspace_hits + keyspace_misses)
命中率低于 90% 时需排查是否有过期 key 未清理、缓存穿透等问题。
性能与延迟指标
bashINFO stats # instantaneous_ops_per_sec — 当前 QPS # total_commands_processed — 累计处理命令数 # 延迟监控(Redis 2.8.13+) CONFIG SET latency-monitor-threshold 100 # 超过 100ms 记录 LATENCY LATEST # 查看最近延迟事件 LATENCY DOCTOR # 诊断延迟原因
QPS 突降或延迟突增是故障的前兆,应设置基线告警。
连接与复制指标
bashINFO clients # connected_clients — 当前连接数 # blocked_clients — 阻塞等待的客户端数 INFO replication # master_repl_offset / slave_repl_offset — 主从复制偏移量差即同步延迟 # master_link_down_since_seconds — 主从断连时长,应为 0
连接数超过 maxclients 的 80% 就应告警;主从偏移量差持续增大说明同步瓶颈。
持久化指标
bashINFO persistence # rdb_last_save_time — 最后 RDB 保存时间 # rdb_changes_since_last_save — 上次保存后变更数,过大说明 RDB 间隔过长 # aof_rewrite_in_progress — AOF 重写是否进行中 # aof_current_size / aof_base_size — AOF 文件大小,重写触发比默认 100%
监控工具选型
原生命令
- INFO:全局状态快照,按 section 查看内存、客户端、复制等
- SLOWLOG:慢查询日志,
SLOWLOG GET 10查看最近 10 条,关注 usec 字段 - MONITOR:实时命令流,生产环境慎用(会降低吞吐约 50%),仅用于紧急排查
- LATENCY:延迟监控框架,可记录延迟事件并给出诊断建议
可观测性体系
Prometheus + Redis Exporter + Grafana 是生产环境主流方案:
bash# 部署 Redis Exporter docker run -d --name redis-exporter \ -e REDIS_ADDR=redis://localhost:6379 \ prom/redis-exporter # Prometheus 抓取配置 scrape_configs: - job_name: redis static_configs: - targets: ["localhost:9121"]
Grafana 可导入 Redis Dashboard(ID: 11835),覆盖内存、QPS、命中率、延迟等核心面板。
Redis Insight 是 Redis 官方可视化工具,支持内存分析、CLI、Profiler,适合开发调试阶段。
哨兵监控
使用 Sentinel 时,除上述指标外还需关注:
bashSENTINEL masters # 主节点状态 SENTINEL slaves <master> # 从节点状态 SENTINEL sentinels <master> # 哨兵节点状态
重点监控主观下线/客观下线事件、故障转移耗时。
常见故障排查
内存不足
现象:OOM command not allowed when used memory > maxmemory
bashINFO memory # 查看内存使用 redis-cli --bigkeys # 扫描大 Key MEMORY USAGE <key> # 查看单个 key 内存占用
解决:调整 maxmemory、设置淘汰策略 allkeys-lru、用 UNLINK 替代 DEL 异步删除大 Key(避免阻塞主线程)、分批 SCAN 删除。
慢查询
bashSLOWLOG GET 10 # 查看慢查询 CONFIG GET slowlog-log-slower-than # 查看阈值
常见原因:KEYS * 全量扫描、大 Key 操作(HGETALL 千万级 hash)、SORT 命令。替代方案:SCAN 替代 KEYS,HSCAN 替代 HGETALL,Pipeline 减少网络往返。
主从同步延迟
bashINFO replication # master_repl_offset 与 slave_repl_offset 的差值
增大 repl-backlog-size、优化网络、避免主节点大 Key 写入导致积压。
连接数打满
bashINFO clients CONFIG GET maxclients
设置 timeout 自动断开空闲连接、排查连接泄漏、适当调大 maxclients。
运维操作要点
备份恢复
RDB 备份用 BGSAVE(后台执行,不阻塞主线程),AOF 备份直接拷贝 .aof 文件。恢复时停止 Redis → 替换文件 → 启动。生产建议 RDB + AOF 混合持久化(Redis 4.0+)。
数据迁移
- MIGRATE 命令:迁移单个或多个 key,原子操作
- RedisShake:阿里开源工具,支持全量+增量同步,适合大规模迁移
bash# RedisShake 配置 source.type: standalone source.address: source.redis.com:6379 target.type: standalone target.address: target.redis.com:6379 ./redis-shake.linux -type=sync -conf=shake.conf
集群扩缩容
bash# 添加节点 redis-cli --cluster add-node <new-ip>:<port> <exist-ip>:<port> # 重新分配槽位 redis-cli --cluster reshard <exist-ip>:<port> \ --cluster-from <src-node-id> \ --cluster-to <dst-node-id> \ --cluster-slots 1000
删除节点前必须先迁走其槽位,否则拒绝删除。
性能优化配置
bash# 内存 maxmemory 2gb maxmemory-policy allkeys-lru echo never > /sys/kernel/mm/transparent_hugepage/enabled # 关闭 THP # 持久化 appendonly yes appendfsync everysec # 折中方案,最多丢 1 秒数据 auto-aof-rewrite-min-size 64mb # 网络 tcp-backlog 511 tcp-keepalive 300 timeout 300 # 空闲连接超时
告警建议:内存使用率 > 80%、QPS 下降 > 50%、延迟 > 100ms、连接数 > 80% maxclients。
以上内容覆盖了 Redis 监控运维的核心考察点,面试中回答时应遵循"指标→工具→排查→优化"的递进逻辑,展示系统性思维而非零散知识点。