aof持久化

1、redis协议

+:表示简单字符串

-:表示错误

::表示整数

$:表示批量字符串

*:表示数组

请求是由批量字符串组成的数组组成

2、aof持久化

当aof持久化功能处于打开状态时,服务器在执行完一个写命令这后,会以协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区的末尾。

在准备睡眠等待事件前都会调用beforeSleep,当中会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到aof文件里。

appendfsync选项值flushAppendOnlyFile行为
always将aof_buf缓冲区中的所有内容写入并同步到aof文件
everysec将aof_buf缓冲区中的所有内容写入到aof文件,如果上次同步aof文件地时间距离现在超过一秒钟,那么再次对aof文件进行同步,并且这个同步操作是由一个线程专门负责执行的。
no将aof_buf缓冲区中的所有内容写入到aof文件,但并不对aof文件进行同步,何时同步由操作系统来决定

 

持久化流程图

3、aof的载入

读入并重新执行aof文件里面保存的写命令,可以还原服务器关闭之前的数据库状态

4、aof重写

redis服务器设置了一个aof重写缓冲区,在服务器创建子进程后开始使用,当redis服务器执行完一个写命令之后,它会同时将这个写命令发送给aof缓冲区和aof重写缓冲区。

在子进程执行aof重写期间,服务器进程需要执行以下三个工作

  1. 执行客户端发来的命令
  2. 将执行后的写命令追加到aof缓冲区
  3. 将执行后的写命令追加到aof重写缓冲区

通过上面来保证:aof缓冲区的内容会定期被写入和同步到aof文件,对现有aof文件的清理工作会如常进行。从创建子进程开始,服务器执行的所有写命令都支被记录到aof重写缓冲区里面。

当子进程完成aof重写工作之后,它会向父进程发送一个信号,父进程在接到该信号之后,会调用一个信号处理函数,并执行以下工作:

  1. 将aof重写缓冲区的所有内容写入到新aof文件中,这时新aof文件所保存的数据库状态将和服务器当前的数据库状态一致。
  2. 对新的aof文件进行改名,原子地覆盖现有的aof文件,完成新旧两个aof文件的替换。

这个信号处理函数执行完毕之后,父进程就可以像往常一样接受命令请求了。

重写时机

  • 手动执行rewriteaof命令
  • aofRewriteSize>aofRewriteMinSize

\frac{aofRewriteSize-aofRewriteBaseSize}{aofRewriteBaseSize}\geq aofRewritePerc

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值