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除读之外的代码,保存的文件大,恢复数据需要重写执行所有的代码,恢复的时间长

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值