rdb文件远小于used_memory_human,因为rdb是经类型编码优化和lzf压缩的二进制快照,剔除了redisobject头、sds元数据、过期时间完整结构等内存运行时开销,并对整数字符串、小哈希、intset等采用紧凑编码。

为什么 dump.rdb 文件远小于 used_memory_human?
因为 RDB 不是内存的“裸拷贝”,而是经过编码优化 + LZF 压缩后的二进制快照。Redis 内存中每个对象都带类型标记、引用计数、LRU 信息等元数据,而 RDB 只保留可还原的键值结构,并对重复/冗余内容做压缩处理。
rdbcompression yes 真的在压缩吗?
是的,但压缩发生在序列化之后、写入磁盘前,且仅对字符串类值生效(如 SET key "hello"),而哈希、列表等复合结构内部仍按紧凑编码存储,不额外走 LZF。
-
rdbcompression yes是默认开启的,它调用的是 LZF 算法(轻量级、CPU 友好) - 整数字符串(如
"123")会被转为更小的变长整型编码,不进入 LZF 流程 - 大块重复文本(如日志片段、JSON 片段)压缩率高;随机二进制或已压缩数据(如 base64 图片)几乎不压缩,甚至略膨胀
- 禁用压缩(
config set rdbcompression no)可降低 CPU 负载,但文件体积通常只增 10%~30%,视数据分布而定
哪些数据在 RDB 中天然更小?
RDB 对不同数据类型做了针对性编码,不是简单 dump 内存布局。例如:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 字符串:若值能转为整数(长度 ≤11 字节),直接存为
int编码,省去长度头和引号 - 哈希:小哈希(field ≤64 个、总字节数 ≤512B)用
ZIPLIST编码,扁平化存储,无指针开销 - 集合/有序集合:整数成员优先用
INTSET,比哈希表节省大量指针和桶空间 - 过期时间:只存 UNIX 时间戳差值(相对于快照时刻),而非完整
time_t
INFO memory 和 RDB 大小对比时容易忽略的关键点
直接拿 used_memory_human 和 dump.rdb 文件大小比,会高估“丢失”空间——因为内存统计包含大量不可持久化的运行时开销:
- Redis 自身代码段、共享库、主线程栈、连接缓冲区等不计入 RDB
- 每个对象的
redisObject头(16 字节)、SDS 元数据(如len/alloc)在 RDB 中被抹除 - 复制积压缓冲区(
repl_backlog)、AOF 缓冲区、Lua 脚本缓存等纯内存结构不会落盘 - 使用
INFO memory里的used_memory_dataset(实际键值数据占用)对比 RDB 更合理,但该值仍含未压缩的内存表示开销
真正影响 RDB 体积的,是键值内容本身的结构密度与重复性,而不是内存用量数字本身。










