不能直接分析大Key,redis-rdb-cli仅输出RDB中序列化长度或元素数量,无法反映真实内存占用,需先用其初筛候选Key,再通过线上MEMORY USAGE命令验证。

redis-rdb-cli 能不能直接分析大Key?
不能直接分析,redis-rdb-cli 本身不带“按内存排序”或“估算Key大小”的能力。它只是个RDB解析器,输出的是原始键值结构(比如 String、Hash、ZSet 类型和长度),但不包含实际内存占用(如编码方式、指针开销、碎片等)。真正能估算空间的,是 Redis 自带的 MEMORY USAGE 命令——但它只能查在线实例,没法对离线 RDB 文件用。
所以必须分两步:先用 redis-rdb-cli 提取候选大Key(比如长度 > 10KB 的 String,或元素数 > 5000 的 Hash),再拿这些 Key 去线上 Redis 查 MEMORY USAGE 验证。
怎么用 redis-rdb-cli 提取潜在大Key?
核心是用 -c memory 模式配合过滤逻辑。注意:这个 memory 不是真实内存,而是序列化后 RDB 中的字节长度(对 String 近似可用,对复合类型仅反映元素数量)。
-
redis-rdb-cli -f /path/to/dump.rdb -c memory -p '.*' --filter-type string --filter-size 10240:提取 RDB 中所有String类型且序列化长度 ≥10KB 的 Key(--filter-size单位是字节) -
redis-rdb-cli -f dump.rdb -c memory -p 'user:.*' --filter-type hash --filter-size 5000:只看user:开头的Hash,且元素数 ≥5000 - 避免用
--filter-size 100这类过小阈值——会吐出几万条结果,失去筛选意义;建议从 5KB / 1000 元素起步试
为什么不能只信 redis-rdb-cli 的 size 字段?
因为 RDB 中记录的 size 是“序列化体积”,不是运行时内存。例如:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 一个
String存了 1MB JSON,RDB size ≈ 1MB,MEMORY USAGE可能达 1.2MB(Redis 字符串对象额外开销) - 一个
Hash有 1000 个字段,RDB size 可能只有几 KB(只记字段数+key长度),但若每个 value 都很长,实际内存可能上 MB -
ZSet和Set在 RDB 中 size 字段基本无参考价值——它只统计成员数,不反映成员字符串长度
所以 redis-rdb-cli 输出的 size 更适合作“初筛信号”,而非结论。必须回到线上 Redis 对 Key 执行 MEMORY USAGE <key> 确认。
线上验证时要注意什么?
别直接在生产主库上扫全量候选 Key,尤其当候选集有几百个时:MEMORY USAGE 是阻塞命令,高频调用会拖慢响应。
- 优先查从库(需开启
slave-read-only no,或临时切到读写从库) - 加限速:用
sleep 0.1控制 QPS ≤10 - 跳过明显不可能大的 Key:比如
counter:*、lock:*这类命名规则明确的,不用查 - 对
Hash/ZSet,可先用HLEN/ZCARD快速排除——如果元素数才几十,基本不用再跑MEMORY USAGE
最常被忽略的一点:RDB 文件可能来自几天前,而线上 Key 可能已被删或膨胀——所以离线分析永远只是线索,不是事实。

















