
23 RedisInsight & 可观测——内存密钥分析 + RDB 解析,Prometheus + Grafana 模板
——把“看不见”的内存变成“可观测”的指标,让每一次 key 过期都能被量化
- 引言:为什么必须“看见”内存
上一篇我们把 20 GB 的 hot key 通过 Redis 7.4 Json + Search 压缩到了 2.3 GB,但 CTO 的下一个问题永远是:“省出来的 17 GB 会不会再涨回去?谁负责盯?”
传统答案靠“人肉 redis-cli --bigkeys”——只能采样、不能回溯、无法告警。本节给出一条完整闭环: - 开发侧:本地用 RedisInsight 交互式探查,秒级定位大 key、过期策略、内存碎片;
- 运维侧:线上用 redis_exporter + Prometheus 把同样的内存数据做成指标,对接 Grafana 模板,实现“key 级别”的容量预测与告警;
- 归档侧:用 rdbtools 解析 RDB,生成 Parquet 丢进 S3,供 Spark 做离线血缘与冷热分级。
整套方案全部开源,一键 docker-compose 拉起,不碰客户端代码。
- RedisInsight:内存显微镜
1.1 安装
docker run -d -p 5540:5540 redislabs/redisinsight:latest
浏览器打开 http://localhost:5540 即可;支持集群模式,会自动发现所有 master 节点。
1.2 三大核心视图
Memory Overview:
- 总内存、数据集、缓冲区、碎片率、Lua、Module 六类实时折线;
- 支持“回放”任意 30 天内的曲线(RedisInsight 在本地保存 1% 采样,不占带宽)。
Keyspace Summary:
- 按照“db + type + ttl 区间”聚合,一眼看出哪个 db0:string 把 45 % 内存吃掉了;
- 点击任意条带,直接下钻到 key 列表,可按“长度、内存、上次访问时间”三列排序。
Biggest Keys:
- 基于 Redis 7 的 MEMORY USAGE 命令,全量扫描不阻塞;
- 支持自定义阈值(>1 MB 或 Top 1000),结果可一键导出 CSV。
1.3 实战 30 秒定位“僵尸”key
场景:内存凌晨 3 点突增 5 GB。
步骤:
a) 在 Memory Overview 里框选 02:50-03:10 的曲线,右键“Analyze Snapshot”;
b) Keyspace Summary 自动对比两个时间点的差分,发现 “db2:list” 新增 4.9 GB;
c) 跳转到 Biggest Keys,按 delta 排序,前 3 个 list 的 ttl=-1,且 lastAccessTime=0;
d) 确认是日志队列消费异常,立即 LTRIM key 0 999 释放 4.7 GB,并给研发发 PR 补上过期策略。
- 把 RedisInsight 的“快照”变成 Prometheus 的“时序”
RedisInsight 适合排查,但无法告警。我们把它底层调用的相同命令(MEMORY、INFO、LATENCY)封装成 redis_exporter 的 4 个新指标,实现 7×24 连续采集。
2.1 自定义 exporter 指标(已合并到 upstream)
HELP redis_key_memory_bytes key 级别内存占用
redis_key_memory_bytes{db=“0”,key=“foo”,type=“string”} 1.23e+06
HELP redis_key_ttl_seconds key 剩余 TTL
redis_key_ttl_seconds{db=“0”,key=“foo”} 86400
HELP redis_db_key_count 按 db+type+ttl 区间聚合的 key 数
redis_db_key_count{db=“0”,type=“hash”,ttl_range=“1h-24h”} 45231
HELP redis_fragmentation_ratio 内存碎片率
redis_fragmentation_ratio 1.37
2.2 采集策略
- 线上 300+ 实例,按“池”区分:缓存池 15 s 拉一次,消息队列池 60 s;
- key 级别指标只采 Top 1000,通过 exporter 的
--check-keys-batch=1000控制,拉取一次 <200 ms; - 使用 Prometheus 的
honor_labels做实例漂移(K8s 场景 pod 重建 IP 变,但 hostname 不变)。
2.3 常用 PromQL
– 过去 1 h 内存增长最快的 5 个 key
topk(5, increase(redis_key_memory_bytes[1h]))
– 预测 72 h 后内存打满(线性外推)
predict_linear(redis_memory_used_bytes[3d], 72*3600) > redis_memory_max_bytes
– 碎片率连续 3 次 >1.5 且内存 >20 GB
redis_fragmentation_ratio > 1.5 and redis_memory_used_bytes > 20e9
- Grafana 模板:一张图看懂“内存健康度”
模板 ID:20504(已上传官方库),开箱即用,含 6 个 Row:
Row 1 内存总览
- 单值 Stat:Used、Max、Frag、Hit Rate;
- 阈值染色:Frag>1.5 红色,Hit<80 % 橙色。
Row 2 Key 级别 TopN
- 表格面板:实时 Top 100 key,带“跳转到 RedisInsight” 深度链接(URL 拼 key 名)。
Row 3 TTL 分布
- 直方图:0-1 h、1-24 h、>24 h、永不过期 四类占比,预测未来 24 h 过期数量。
Row 4 热 Key 探测
- 基于 redis_latency_percentile_p99 与 redis_key_access_total,用 Grafana 的 Heatmap 把“访问频率>1 kqps 且内存>1 MB”的 key 标红。
Row 5 容量预测
- 使用 predict_linear 做 3 d/7 d/14 d 三线预测,右侧放 Alertmanager silences 快捷入口。
Row 6 集群均衡
- 多实例对比:内存、key 数、ops,箱线图一眼看出倾斜。
- RDB 离线解析:把“快照”变成“数据湖”
虽然 Prometheus 能看趋势,但做不了“key 血缘”与“冷热分级”。我们把 RDB 文件解析后入湖,供数据治理团队二次分析。
4.1 流水线
Redis 副本节点 → 每日 02:00 生成 RDB → S3 触发 Lambda → rdbtools 解析 → Parquet 分区(日期+实例)→ Glue Catalog → Spark SQL。
4.2 rdbtools 加速
- 使用 github.com/leonchen83/redis-rdb-tools 的
rdb -c memory模块,单线程 1 GB/min; - 通过
--bytes 128只导出 >128 B 的 key,压缩后 1 TB RDB → 120 GB Parquet; - 新增字段:idle_time(空转时长)、access_frequency(估算)、encoding、pointer_size,方便后续打分。
4.3 冷热打分公式
score = α·(idle_time/86400) + β·(1/access_frequency) + γ·(memory/1e6)
α=0.5, β=0.3, γ=0.2,score>0.8 的 key 打入冷节点或压缩成 listpack。
4.4 产出示例
运行 30 天,发现 7 % 的 key 占 62 % 内存但零访问,全部迁移至 SSD 版 Redis,节省 48 % 云账单。
- 一键部署:docker-compose 栈
git clone https://github.com/your-org/redis-observability
cd redis-observability
cp env.tpl .env # 填 redis 地址与 S3 AK/SK
docker-compose up -d
服务列表
redisinsight :5540
prometheus :9090
grafana :3000 (admin/admin)
redis_exporter :9121
minio :9000 (本地 S3 替代)
- 常见坑与调优
- 开启
lazyfree-lazy-eviction yes,否则大 key 删除会阻塞导致 exporter 超时; - Prometheus 的
--storage.tsdb.retention.time=30d即可,key 级别指标基数大,30 d 后降采样到 5 min; - redis_exporter 的
--include-config-metrics会暴露 password,生产环境关闭; - RedisInsight 的“回放”功能依赖本地 SQLite,若实例数 >100,建议挂载 SSD 盘;
- RDB 解析作业与副本节点 CPU 抢占,给 Lambda 留 1 vCPU 即可,解析 100 GB RDB 费用 <0.3 $。
- 结语:让内存从“成本中心”变成“可观测资产”
通过 RedisInsight 交互式诊断 + Prometheus 持续监控 + RDB 离线治理,我们把“内存”这一黑盒拆成了三张视图:
- 开发视角:秒级定位,PR 前就能自证清白的 MR;
- 运维视角:容量预测、碎片告警、自动弹缩;
- 财务视角:冷热分级、降本幅度可量化,直接写进季度汇报。
下一步,我们将把同样的思路移植到 Redis on Flash / KeyDB,并尝试把“key 级别”的指标喂给 K8s HPA,实现真正的“内存弹性”——让业务不再问“Redis 需要多少内存”,而是“内存需要多少业务”。
更多技术文章见公众号: 大城市小农民
1149

被折叠的 条评论
为什么被折叠?



