RDB文件存储的是某时间点的全量数据二进制快照,仅含键值对本身及元信息,不存命令或操作日志;AOF则记录每条写命令的原始RESP协议文本,含冗余前缀、换行符等,体积更大、恢复更慢。

RDB文件只存数据快照,不存操作日志
RDB 文件本质是某个时间点的全量数据二进制快照,dump.rdb 里直接序列化存储键值对本身,比如一个 SET user:1001 {"name":"alice","age":28} 就存成紧凑的二进制结构,不含命令名、参数分隔符、协议头等冗余信息。而 AOF 文件(appendonly.aof)记录的是每条写命令的原始 RESP 协议文本,像 *3\r\n$3\r\nSET\r\n$8\r\nuser:1001\r\n$37\r\n{"name":"alice","age":28} 这种格式,光换行符 \r\n 和长度前缀(如 $37)就占不少空间。
AOF会累积重复写入和过期键残留
即使同一个 key 被反复修改 100 次,RDB 最终只保留最后一次的值;但 AOF 会逐条记下全部 100 条 SET 命令。更关键的是:如果 key 后来被 DEL 或自然过期,RDB 快照里根本不会包含它;而 AOF 默认仍保留当初的写入记录,直到触发 bgrewriteaof —— 且重写也不是实时的,中间窗口期 AOF 文件持续膨胀。
RDB默认启用LZF压缩,AOF默认不压缩
Redis 默认开启 rdbcompression yes(使用 LZF 算法),对字符串类 value 压缩效果明显;而 AOF 是纯追加文本日志,appendonly.aof 文件本身不支持内置压缩,哪怕你用 gzip 手动压缩,也不能被 Redis 直接加载。有些用户误开 aof-use-rdb-preamble yes(混合持久化),那也只是在 AOF 文件头部塞一段 RDB 格式数据,并不改变主体日志的冗余特性。
大 value 或频繁写入时体积差距会指数级拉大
比如一个 1MB 的哈希表,RDB 序列化后可能压到 300KB;而如果这个哈希是通过 1 万次 HSET 逐步建起来的,AOF 就得记 1 万行带前缀的命令,实际体积轻松突破 5MB。这种差距在线上高写入场景(如计数器、实时日志聚合)里特别扎眼——这也是为什么很多团队在启用了 AOF 后,发现磁盘增长远超预期,却没意识到根源不在数据量,而在写入模式。
真正容易被忽略的一点是:bgrewriteaof 生成的新 AOF 文件虽会去重,但它仍然基于命令重放逻辑,无法像 RDB 那样彻底丢弃中间态;一旦配置了 appendfsync always 或大量小 key 写入,AOF 的体积劣势就很难靠调参扳回来。











