RedisNotes

第 21 章:监控告警

zjc 于 2026-01-21 发布

这是《Redis 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 没有监控的 Redis 就是一颗定时炸弹。本章建立覆盖可用性、内存、性能、持久化、复制、客户端与业务的指标体系。

21.1 监控分层

业务层:命中率、降级次数、锁失败、库存失败
应用层:连接池、命令耗时、异常、序列化
Redis层:QPS、内存、慢查询、淘汰、持久化
高可用层:主从状态、哨兵、Cluster 拓扑
系统层:CPU、内存、磁盘、网络、进程

只监控 Redis 进程存活是不够的,缓存命中率下降本身就是重大业务风险。

21.2 核心指标

可用性

指标 获取方式 告警
ping PING 连续失败 P0
connected_clients INFO clients 异常突增
blocked_clients INFO clients >0 持续
rejected_connections INFO stats >0

内存

指标 说明
used_memory Redis 数据内存
used_memory_rss OS 驻留内存
maxmemory 上限
mem_fragmentation_ratio 碎片率
evicted_keys 淘汰 key 数
expired_keys 过期 key 数

建议告警:

used_memory / maxmemory > 80% 警告
used_memory / maxmemory > 90% 严重
evicted_keys 突增
碎片率 > 1.5 持续

性能

指标 说明
instantaneous_ops_per_sec 当前 QPS
slowlog_len 慢查询条数
慢查询条目 命令与耗时
latency_percentiles_usec 命令延迟分位(新版本)
total_commands_processed 累计命令
latest_fork_usec 最近 fork 耗时

持久化

指标 说明
rdb_bgsave_in_progress RDB 进行中
rdb_last_save_time 上次成功保存
rdb_last_bgsave_status 上次结果
aof_enabled 是否开启 AOF
aof_last_write_status AOF 写状态
aof_delayed_fsync fsync 延迟次数
aof_current_size AOF 大小

复制与高可用

主节点:

role
connected_slaves
master_repl_offset
slaveN offset
repl_backlog_size

从节点:

master_link_status
master_last_io_seconds_ago
slave_read_repl_offset
master_repl_offset

Cluster:

cluster_state
cluster_slots_assigned / ok / fail / pfail
cluster_known_nodes
cluster_size

21.3 业务指标

缓存:

cache_request_total
cache_hit_total
cache_miss_total
cache_hit_ratio
cache_fallback_db_total
cache_rebuild_duration
cache_error_total

锁:

lock_acquire_total
lock_acquire_failure_total
lock_wait_duration
lock_hold_duration
lock_release_failure_total

队列:

queue_length
enqueue_total
dequeue_total
pending_total
dead_letter_total

命中率下降往往比 Redis CPU 更早暴露问题。

21.4 采集方式

redis-cli 定时采集

while true; do
  redis-cli INFO memory | grep used_memory
  sleep 10
done

适合临时排查,不适合生产完整监控。

Prometheus redis_exporter

scrape_configs:
  - job_name: redis
    static_configs:
      - targets:
          - redis-exporter:9121

redis-exporter 示例参数:

redis_exporter \
  --redis.addr=redis://redis:6379 \
  --redis.password=xxx

Grafana 面板

推荐至少四块:

  1. 可用性与连接;
  2. 内存与淘汰;
  3. QPS/延迟/慢查询;
  4. 复制/哨兵/Cluster。

再加一块业务面板:命中率、回源 DB、降级、锁失败。

21.5 日志采集

Redis 服务端日志:

慢查询
RDB/AOF 错误
复制断开
OOM
主从切换
Cluster 槽迁移

客户端日志:

连接超时
命令超时
重试
序列化失败
池耗尽
MOVED/ASK

建议统一 trace_id + key 前缀(不要打完整敏感 value)。

21.6 告警分级

级别 条件示例
P0 PING 失败;Cluster state fail;主从全部不可用;写入持续失败
P1 内存 >90%;慢查询持续增加;复制断开;AOF 写失败;命中率骤降
P2 内存 >80%;碎片率高;单从节点延迟增长;连接数异常
提醒 淘汰增长、大 key 数量、配置变更、备份失败

告警必须带 runbook:

现象
影响
确认命令
应急动作
升级路径
后续修复

21.7 巡检脚本示例

#!/usr/bin/env bash
REDIS="redis-cli -h redis -a $PASS"

echo "== ping =="
$REDIS ping

echo "== memory =="
$REDIS INFO memory | grep -E \
  'used_memory_human|maxmemory_human|mem_fragmentation_ratio'

echo "== stats =="
$REDIS INFO stats | grep -E \
  'instantaneous_ops_per_sec|evicted_keys|rejected_connections'

echo "== slowlog =="
$REDIS SLOWLOG GET 5

echo "== replication =="
$REDIS INFO replication | grep -E \
  'role:|connected_slaves:|master_link_status:'

本章小结

思考题

  1. Redis CPU 正常但接口变慢,应该看哪些客户端指标?
  2. evicted_keys 增长一定是问题吗?如何结合数据类型判断?
  3. 如果只能保留 5 个 Redis 指标,你选什么?