Redis持久化技术之混合持久化 学习笔记

64 阅读2分钟

前言

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文件。

image.png

也就是说,使用了混合持久化,AOF文件的前半部分是RDB格式的全量数据,后半部分是AOF格式的增量数据

这样好处在于,重启Redis的时候,由于前半部分是RDB内容,加载速度快很多。加载完才会处理后半部分的AOF内容,这些是Redis后台子进程重写AOF期间,主进程处理客户端发来的命令,属于增量命令,数量相对少,相比完全采用RDB可以使得数据更少丢失

参考

《小林coding》