前言
AOF和RDB都会用一个日志文件来记录信息,但记录的内容是不同的
- AOF记录的是操作命令
- RDB记录的是二进制数据
尽管RDB比AOF的数据恢复速度快,但快照记录的频率不好把握:
- 如果频率太低,两次写快照间一旦服务器宕机,可能丢失比较多的数据
- 如果频率太高,写磁盘和创建子进程会带来额外的性能开销
那有没有什么方法既有 RDB 恢复速度快的优点,又有 AOF 丢失数据少的优点呢?
那就是混合使用 AOF 日志和内存快照,也叫混合持久化,在Redis 4.0提出
实现原理
想要开启混合持久化功能,可以在 Redis 配置文件修改
aof-use-rdb-preamble yes
混合持久化实际发生在AOF日志重写过程中
当开启了混合持久化,在AOF重写过程中,fork出来的子进程会先将与主进程共享的内存数据以RDB的方式写入AOF文件,然后主进程处理操作命令会被记录在重写缓冲区,重写缓冲区的增量命令会以AOF方式写入到AOF日志,写入完成后通知主进程将新的含有RDB格式和AOF格式的文件替换旧的AOF文件。
也就是说,使用了混合持久化,AOF文件的前半部分是RDB格式的全量数据,后半部分是AOF格式的增量数据
这样好处在于,重启Redis的时候,由于前半部分是RDB内容,加载速度快很多。加载完才会处理后半部分的AOF内容,这些是Redis后台子进程重写AOF期间,主进程处理客户端发来的命令,属于增量命令,数量相对少,相比完全采用RDB可以使得数据更少丢失
参考
《小林coding》