redis持久化方式之AOF详解
1.什么是AOF
AOF--append only file,字面的意思是"仅追加文件"。其实AOF指的是redis在持久化的时候,每次需要记录的是redis中除了读之外的所有指令,每次将这些指令添加到aof文件中,不允许进行进行除添加之外的任何操作。在redis.conf文件中appendfsync参数用来设置aof文件被写入的策略,一边appendfsync有如下几种策略:
(1)always,表示只要缓冲区中数据发生更改,则就将该数据写入到aof文件中;
(2)everysec,每秒写入把缓冲区中数据写入aof文件中(redis默认);
(3)no,不做任何策略配置,将策略的配置交给操作系统,一般操作系统是等待缓冲区被占完之后,将数据写入aof文件中。
2.AOF持久化方式的原理
实际上,redis底层并不是向上述描述那样,实实在在地把每一条指令都进行记录到磁盘中,这样做明显记录的指令的数量就十分庞大,举一个例子 set keyy 1,比如我们现在需要将keyy的值从1加到100,假设redis服务器执行了99次完成了任务,根据前面描述的策略,则aof将被写入99次,这样明显太傻,是不是可以进行一次写入,直接set keyy 100,这样所占磁盘大小必然是很小的。----当时是有着策略的,这就是AOF的重写策略,它解决AOF文件不断增加的问题。
AOF的重写策略描述如下图:
首先需要介绍下CopyOnWrite原理,就是写时复制。其基本策略就是,假设一个父线程和子线程同时对共享数据进行操作,如果数据没有发生改变,父线程和子线程仅仅是进行单纯的读操作,那么共享数据不发生改变,维持现状;但是如果共享数据发生来改变(某线程进行了写操作),那么将会生成一个数据的复本供父线程使用。
下面介绍上述AOF重写过程:
(1)首先redis服务fork出一个子进程,该子进程的主要目地就是不依赖已存在的AOF文件,仅仅通过redis中已有的数据生成新的AOF文件;
(2)主进程将实时的redis中的数据变动写入AOF缓冲区(这个数据是要写入老AOF文件中的)和重写缓冲区;
(3)子进程通知主进程完成对旧数据的AOF重写;
(4)主进程现在将重写缓冲文件添加到子进程完成重写之后的AOF文件之后,形成新的AOF文件,替代老的AOF文件
流程图:
3.AOF持久化方式的优缺点
虽然说AOF持久化方式是一种优良的持久化方案,但是也不是说AOF持久化方式是完美无暇的,其优缺点如下:
优点:AOF持久化方式相比于RDB来说,可读性高(保存的是代码,可读性好),适合保存增量数据,数据不易丢失
ps:为什么数据不容易丢失?因为数据被保存在内存中的AOF缓冲区中,数据不易丢失。
缺点:保存基本上所有redis除读之外的代码,保存的文件大,恢复数据需要重写执行所有的代码,恢复的时间长。