REdis-5.0之前的AOF文件没有文件头,不管是REdis-5.0之前还是REdis-5.0,它们的AOF文件体内容都如下图所示:
从REdis-5.0开始,AOF有文件头,目的是支持同时加载RDB和AOF文件。AOF文件头和RDB文件头基本相同,但RDB文件头多了三个字段。
先看AOF和RDB通用部分的文件头内容:
1) 头5字节固定为REDIS
2) 第6~9共四字节为RDB版本号
3) 接下来为redis-ver和它的值,即redis版本
4) 接着redis-bits和它的值,即redis的位数,值为32或64
5) 接着为ctime和它的值,值为当前时间戳
6) 接着为used-mem和它的值
7) 最后是aof-preamble和它的值,值为0或1,1表示RDB有效。
RDB的文件头和AOF基本相同,但在aof-preamble之前多了如下三项:
1) repl-stream-db
2) repl-id
3) repl-offset
AOF文件中并未保存已复制的偏移(repl-offset),这个信息只保存在RDB文件头中。因此当进程重启时,并不能从AOF文件恢复复制偏移,除非以RDB方式运行(配置项appendonly为NO时)。
但是从REdis-5.0开始,加载AOF文件时,先读AOF文件头,如果发现有文件头(Reading RDB preamble from AOF file...),则会先从RDB加载数据,并恢复前面提到的复制偏移(repl-offset)等三项数据,剩余部分再从AOF文件读取(Reading the remaining AOF tail...)。