redis无内置内存预警机制,必须用prometheus+redis exporter监控;需配置recording rule计算memory_used_percent,并设70%警告、90%紧急告警,注意maxmemory必须显式设置且避免除零。

Redis 本身不提供“内存使用率 70% 就发预警”的内置告警机制,maxmemory 配置只控制淘汰行为(如 allkeys-lru),不触发通知。真要提前预警,必须依赖外部监控系统——Prometheus + Redis Exporter 是目前最轻量、最可控的组合。
为什么不能靠 redis.conf 的 maxmemory + 淘汰策略来预警
淘汰是被动兜底,不是预警:maxmemory 设为 2GB 后,Redis 只在写入导致内存超限时才触发淘汰,此时已无缓冲空间;它不会主动告诉你“你快到 1.4GB 了”。更关键的是,used_memory 是 Redis 进程内分配的内存,而操作系统看到的 used_memory_rss 可能因内存碎片更高,单纯看配置阈值容易误判。
-
maxmemory是硬限制,不是水位线;它不输出指标,也不支持回调 - Redis 的 INFO 输出里有
used_memory和maxmemory,但没人监听它就只是静态快照 - 即使你用脚本轮询
redis-cli info memory | grep used_memory,也难保证实时性、去重和告警抑制
用 Prometheus 抓取 Redis Exporter 的 memory_used_percent 指标
Redis Exporter 默认不直接暴露百分比,得自己算。Prometheus 中定义一个 recording rule 或 alert rule 时,用如下表达式:
100 * (redis_memory_used_bytes{job="redis"} / redis_memory_max_bytes{job="redis"})
注意两点:
- 确保
redis_memory_max_bytes不为 0:如果 Redis 没配maxmemory,该值是 0,会导致除零错误;建议所有生产实例都显式设置maxmemory - 用
redis_memory_used_bytes,不是redis_memory_used_human—— 后者是字符串,Prometheus 无法计算 - 如果你用的是旧版 Exporter(v1.30 以前),可能没有
redis_memory_max_bytes,需改用redis_exporter_build_info标签 + 外部配置补全
在 Prometheus rules.yml 里写 70% 预警规则
不要把预警和紧急告警混在一个 rule 里。推荐分层写:
groups:
- name: redis-memory-alerts
rules:
- alert: RedisMemoryUsageWarning
expr: 100 * (redis_memory_used_bytes / redis_memory_max_bytes) > 70
for: 5m
labels:
severity: warning
annotations:
summary: "Redis instance {{ $labels.instance }} memory usage > 70%"
description: "Current: {{ $value | humanize }}%, max: {{ $labels.redis_memory_max_bytes | humanize }}B"
- alert: RedisMemoryUsageCritical
expr: 100 * (redis_memory_used_bytes / redis_memory_max_bytes) > 90
for: 2m
labels:
severity: critical
annotations:
summary: "Redis instance {{ $labels.instance }} memory usage > 90%"
description: "Eviction likely imminent; check keyspace growth and memory fragmentation."
关键细节:
-
for: 5m是防抖,避免瞬时 spike 误报;但 90% 要更快响应,所以设成2m - 务必加
labels里的severity,否则 Alertmanager 无法路由到不同通道(如 Slack warning channel vs. phone call channel) - 别漏掉
annotations.description—— Grafana 告警面板或 PagerDuty 里点进去就靠它快速判断是否要立刻介入
-
Grafana 里怎么验证这个阈值是否真被识别
别等告警来了再查。在 Grafana 新建一个 Panel,数据源选 Prometheus,Query 写:
100 * (redis_memory_used_bytes{job="redis"} / redis_memory_max_bytes{job="redis"})
然后打开「Alert」tab,粘贴上面 rule 的 expr,Grafana 会模拟评估逻辑并标出触发时间线。最容易被忽略的一点是:如果你的 Redis 实例没配 maxmemory,这个表达式在 Prometheus 里会显示 “no data”,而不是 0 —— 它直接静默失败,不会报错,但告警永远不会触发。











