JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢

2020-05-30  本文已影响0人  adminmane

为什么需要持久化,以及Redis持久化的RDB方式在这篇文章讲的已经很透彻了,足以吊打面试官了。而且此篇内容需要RDB文章的内容支持,所以建议先看下:看完这篇还不懂Redis的RDB持久化,你们来打我!

一、什么是AOF

它也是Redis持久化的重要手段之一,aof->Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。

二、优缺点

1、优点

2、缺点

三、AOF原理

1、基础原理

就是每次都在aof文件后面追加命令。他与主进程收到请求、处理请求是串行化的,而非异步并行的。图示如下

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?

在这里插入图片描述

所以aof的频率高的话绝逼会对Redis带来性能影响,因为每次都是刷盘操作。跟mysql一样了。Redis每次都是先将命令放到缓冲区,然后根据具体策略(每秒/每条指令/缓冲区满)进行刷盘操作。如果配置的always,那么就是典型阻塞,如果是sec,每秒的话,那么会开一个同步线程去每秒进行刷盘操作,对主线程影响稍小。

2、额外扩展

其实Redis每次在写入AOF缓冲区之前,他都会调用flushAppendOnlyFile(),判断是否需要将AOF缓冲区的内容写入和同步到AOF文件中。这个决策是由配置文件的三个策略来控制的

四、REWRITE

1、为什么要rewrite?

比如我有业务很简单,就来回delete set 同一个key。就这个业务运行了10年,那么aof文件将记录无数个delete k1, set k1 xxx。其实都是重复的,但是我aof每次都追加,文件变成了1T大小。这时候Redis宕机了,要恢复,你想想1TB大小的aof文件去恢复,累死了。最主要的是1TB大小只记录了两个命令,所以压缩其实就是来处理这件事的。

2、4.0版本之前的rewrite

Redis4.0之前和Redis4.0的rewrite(重写)方式不一样,Redis4.0之前就是将aof文件中重复的命令给去掉。保留最新的命令。进而减少aof文件大小。比如

set k1 123set k1 345del k1set k1 789

经过rewrite后(Redis4.0之前),只会变成如下

set k1 789

3、4.0版本以及之后的rewrite

4.0之前的做法效率很是低下,需要逐条命令对比。4.0开始的rewrite支持混合模式(也是就是rdb和aof一起用),直接将rdb持久化的方式来操作将二进制内容覆盖到aof文件中(rdb是二进制,所以很小),然后再有写入的话还是继续append追加到文件原始命令,等下次文件过大的时候再次rewrite(还是按照rdb持久化的方式将内容覆盖到aof中)。但是这种模式也是配置的,默认是开,也可以关闭。

4、rewrite触发条件

1、手动触发

2、自动触发

通过以下两个配置协作触发

auto-aof-rewrite-min-size

AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。

auto-aof-rewrite-percentage

当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比,如100代表当前AOF文件是上次重写的两倍时候才重写。

3、触发满足条件

前两点也就是说只允许同时fork()一个子进程出来干活。

5、rewrite原理

4.0之前版本的,和4.0以及之后关闭混合模式的情况下。

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?

在这里插入图片描述

五、RDB-AOF混合持久化

redis4.0之后才支持,默认开启

1、优点

混合持久化结合了RDB持久化 和 AOF 持久化的优点,采取了rdb的文件小易于灾难恢复,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

2、缺点

兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,需要专业的工具来阅读,因为是二进制,所以阅读性较差。

3、原理

需要先掌握看完这篇还不懂Redis的RDB持久化,你们来打我!和此篇幅的aof

混合持久化也是通过bgrewriteaof完成的,所以基本流程和上述一样。不同的是当开启混合模式时,fork出的子进程先将共享的内存副本全量以RDB的方式写入aof。这样提高了速度也极大的缩小了aof文件(毕竟都是二进制)。写完还是通知主进程,然后再将重写缓冲区的内容以AOF方式写入到文件,然后替换旧的aof文件。也就是说这种模式下的aof文件发生rewrite后前半部分是rdb格式(REDIS开头的二进制数据),后半部分是正常的aof追加的命令(重写缓冲区里的)。

4、数据恢复

会优先看是否存在aof文件,若存在则先按照aof文件恢复,因为aof毕竟比rdb全。若aof不存在,则才会查找rdb是否存在。这是默认的机制。毕竟aof文件也rewrite成rdb二进制格式,文件小,易于回复。所以redis会优先采取aof。

六、总结

此篇都是重点,废话很少。没啥可总结的。

最后小编整理了一套技术资料不仅能精准消除技术盲点、累计面试经验,更可以攻克JVM、Spring、分布式、微服务等技术难题。

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?

海量电子书,珍藏版

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢? 天天在用Redis,那你对Redis的AOF持久化到底了解多少呢? 天天在用Redis,那你对Redis的AOF持久化到底了解多少呢? 天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?

以上资料领取步骤

1、加微信获取


1892324-20200408173704995-149739833.png
上一篇 下一篇

猜你喜欢

热点阅读