redis aof持久化

aof持久化

aof持久化是通过保存服务器执行的写命令来记录数据库的状态。
aof持久化功能的实现可以分为命令追加,文件写入,文件同步三个步骤。
当aof功能处于打开状态,服务器执行写命令,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。
struct redisServer {
// …
// aof 缓冲区
sds aof_buf;
}
redis服务器进程是一个事件循环,这个循环事件负责接收客户端的命令请求,以及向客户端发送命令,而时间事件则执行像serverCron这样需要定期运行的函数。
服务器可能会执行写命令,使得一些内容被追加到aof_buf缓冲区里面,所以在服务器每次结束一个事件循环之前,都会调用flushAppendOnlyFile函数,考虑是否需要将缓冲区的内容写入和保存到aof文件里面。flashAppendOnlyFile会根据服务器配置的appendfsync选项的值来决定
always 将aof buf区的所有内容写入到aof文件
everysec 将aof buf缓冲区中的所有内容写入到aof文件,如果上次同步aof文件的时间距离现在超过一秒钟,那么再次对aof文件进行同步,并且这次同步是由一个线程专门完成的
no 将aof_buf缓冲区中的所有内容写入到aof文件,但并不对aof文件进行同步,何时同步有操作系统决定
默认是everysec

aof的载入和数据还原

redis 读取aof文件并还原数据库状态的步骤如下:
1.创建一个不带网络连接的伪客户端:因为redis的命令只能在客户端上下文中执行,而载入aof文件时所使用的命令直接来源于aof文件而不是网络连接
2.从aof文件中解析出一条写命令
3.执行该命令
4.重复2和3步骤,直到命令执行完毕。

aof重写

aof通过记录写命令来记录数据库的状态,随着时间推移,存储的文件会越来越大,内容越来越多,文件的体积也会越来越大,如果不加控制,会对宿主计算机造成影响。
aof会进行一个命令的一个合并比如连续的多个rpush操作,rpush a,b,c这种合并成一条命令

aof后台重写,aof_rewrite函数很好的完成创建一个新aof文件的任务,但是这个会进行大量的写操作,调用这个函数的线程会长时间阻塞,因为redis单个线程来处理命令请求,所以服务器直接调用函数,在重写过程中,就无法响应来自客户端的命令。所以采用将aof重写程序放到子进程去执行。
这样服务器在重写期间,任然可以响应命令请求
子进程带有服务器进程的数据副本,使用子进程,而不是线程,避免使用锁降低,数据的安全性
在重写期间,新的命令到来,而重写之后恢复的状态和服务器当前的状态不一致,为了解决这种不一致的问题,redis设置了重写buf区。在重写期间,服务器进程执行以下三个工作
1)执行客户端发来的命令
2)将执行后的写命令追加到aof buf区
3)将执行后的写命令追加到aof重写缓冲区
这样就可以保持数据的同步,子进程在重写完成后,给父进程发送信号,父进程调用信号处理函数。
处理步骤:
1.将重写缓冲区的内容写入到新的aof文件中,这时新的aof文件所保存的数据库状态,和当前的数据库状态一致。
2.对新的aof文件进行改名,覆盖原有的aof文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值