Redis的这种AOF重写机制(也称为“混合持久化”)是对传统AOF机制的优化,核心是结合了RDB和AOF的优点,既保证数据安全性,又提升恢复效率。我们可以从设计目的、具体流程和优势三个层面理解:
1. 设计目的:解决传统AOF的痛点
传统AOF重写的逻辑是:通过读取内存中的数据,生成“重建这些数据所需的最小命令序列”(比如将多次修改同一个key的命令合并为一个),最终重写后的AOF文件是纯命令日志。但这种方式有两个明显缺点:
- 文件体积较大:即使经过重写,命令序列依然可能比RDB的二进制快照更冗余(比如一个
hash的100次修改,RDB只需记录最终状态,而AOF需要记录合并后的1条命令,但命令本身仍比二进制占用空间)。 - 恢复速度慢:AOF恢复时需要从头执行所有命令,当文件较大时,恢复耗时很长。
而混合持久化的设计目标就是:用RDB的“紧凑快照”解决体积和恢复速度问题,用AOF的“命令日志”解决数据实时性问题。
2. 具体流程:RDB打底 + 增量命令补全
当开启混合持久化(通过配置aof-use-rdb-preamble yes)后,AOF重写的过程如下:
-
第一步:写入RDB快照
重写开始时,Redis会先fork一个子进程,子进程读取当前内存中的全量数据,以RDB格式(二进制快照)写入一个临时文件。这部分数据记录的是“重写开始时刻”的内存快照,体积小、结构紧凑。 -
第二步:追加增量命令
在子进程写入RDB的过程中,主进程可能会接收新的写命令(比如新增、修改数据)。这些“重写期间产生的增量命令”会被主进程记录到“重写缓冲区”中。
当子进程完成RDB写入后,主进程会将“重写缓冲区”中的所有增量命令,以AOF命令日志格式追加到临时文件末尾。 -
第三步:替换旧AOF文件
临时文件最终包含两部分:[RDB二进制数据] + [增量AOF命令]。最后用这个临时文件替换旧的AOF文件,完成重写。
3. 优势:兼顾“速度”和“安全性”
这种混合格式的AOF文件,完美结合了RDB和AOF的优点:
- 恢复速度快:加载时,先快速解析开头的RDB快照(二进制格式,解析效率远高于执行命令),得到“重写时刻”的数据;再执行后续的增量AOF命令,得到“重写后到当前”的最新数据。整体恢复速度比纯AOF快得多。
- 数据安全性高:后续的增量命令以AOF格式记录,支持
fsync策略(比如每秒刷盘),确保最新数据不丢失,避免了RDB“快照间隔期间可能丢数据”的问题。 - 文件体积小:开头的RDB是二进制压缩格式,比纯AOF的命令日志更紧凑,减少磁盘占用。
总结
简单来说,这种机制就是:用RDB的“快照”快速记录历史数据(解决体积和恢复速度),用AOF的“命令日志”记录最新增量(解决数据实时性)。既保留了AOF“可追更、低丢失风险”的优势,又弥补了传统AOF“恢复慢、文件大”的缺点,是Redis持久化的一种高效优化。