前言
前面文章中我们也介绍过Redis的持久化方式有两种:rdb持久化和aof持久化,具体详情可查看之前文章redis持久化。rdb持久化还是aof持久化它们都有各自的缺点。
rdb和aof缺点
rdb持久化:由于是定期对内存数据快照进行持久化,因此在两次持久化之间,如果存在数据更新时就会导致数据的不一致性。
aof持久化:它是以日志的方式记录下每次操作,因此在数据恢复时它的性能会相对比较低,而redis本身就是以追求性能为主的一种数据库。
所以在redis4.0之后redis支持了rdb和aof混合的持久化方式,这样就可以在数据一致性和性能高效下达到更好的兼容。
混合模式工作原理
混合模式开启
其实在redis4.0之后,redis默认是开启的rdb的持久化方式,如果需要开启混合模式则需要将配置项 aof-use-rdb-preamble 修改为 yes。
持久化工作流程
混合模式持久化是通过bgrewriteaof命令操作的,持久化完成后最终只有一个aof文件,具体流程如上图:
1. bgrewriteaof开始,redis会启动一个子进程将当前内存的数据进行快照。
2. 将数据快照以二进制的rdb格式,写进aof文件的头部。
3. 之后的操作则依然以aof日志的方式追加到aof文件后面。
数据恢复工作流程
redis重启数据恢复过程如上图:
1. 首先会先判断是否开启AOF持久化,如果未开启则进入RDB的数据恢复流程。
2. 发现开启了AOF持久化则会找到对应的AOF文件进行读取。
3. 读取时会对文件头部内容进行分析,如果发现是RDB格式的数据则加载RDB数据内容,再加载剩余的AOF日志。
4. 如果头部不是RDB文件格式则直接以 AOF 格式加载整个文件。
5. 文件加载完成后则数据也恢复完毕。
总结
Redis其设计之初就是以性能著称因此在很多时候它默认的设置或者是推荐的设置都会基于性能高效为主,4.0开始之后推出的混合模式也是为了能够中和性能和数据一致性的平衡。5.0版本之后redis默认会将混合持久化开启,我认为它应该也是在实践后修复和迭代了混合模式的性能才将配置项默认开启。
混合持久化的缺点也很明显,因为在文件头部插入了RDB格式的数据且它还是二进制的数据这就让AOF文件的可读性变得更差,还有就是对4.0之前的旧版本则不兼容。但不管使用哪种技术方案都必然会有它的缺点存在,我们应该更多的考虑我们需要什么,充分的发挥它的优势,对于它的缺点可以采用其他的补偿机制来弥补。
技术之路任重道远,我相信Redis还会持续再更新迭代,最终它的持久化机制也变得更高效、更安全。