redis(10)AOF持久化

1、AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的,在AOF文件中,除了用于指定数据库的select命令是服务器自动添加的之外,其他都是我们之前通过客户端发送的命令

2、服务器启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭之前的数据库状态

3、AOF持久化功能的实现可以分为命令追加(append),文件写入、文件同步(sync)三个步骤

4、命令追加

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

5、aof文件的写入与同步

5.1、redis的服务器进程就是一个事件循环,这个循环中,文件事件负责接收客户端命令请求,以及向客户端发送命令回复,时间事件则负责执行像servercron函数这样需要特定运行的函数,服务器每次结束一个事件循环之前,它都会调用flushappendonlyfile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到aof文件里

5.2、flushappendonlyfile函数行为由appendfsync选项值来决定

always 将aof_buf缓冲区的所有内容写入并同步到aof文件 效率慢,机器故障不丢失数据

everysec 默认值  将aof_buf缓冲区中所有内容写入到aof文件,如果上次同步aof文件时间,距离现在超过一秒钟,那么再次对aof文件进行同步,并且这个同步操作是由一个线程专门负责执行的 效率有保证,机器故障丢失一秒钟数据

no 将aof_buf缓冲区的所有内容写入到aof文件,但并不对aof文件进行同步,何时同步由操作系统决定 效率高,机器故障丢失数据不确定

6、aof文件的载入与数据还原

6.1、重新执行一遍aof文件里面保存的命令就可以还原服务器关闭前的数据库状态

6.2、步骤 创建不带网络连接的伪客户端 读取文件一条命令,执行,读取下一行 执行,知道文件末尾

7、为了解决aof文件体积膨胀问题,redis提供了aof文件重写功能,redis可以撞见一个新的aof文件来替代现有的aof文件,新旧两个数据库状态相同,但是新的不会包含任何浪费空间的冗余命令,由紫禁城执行,子进程不是线程,可以在避免使用锁情况下,保证数据安全性,

8、子进程执行重写带来数据库状态不一致问题,解决这个问题,创建一个重写缓冲区,子进程执行重写命令期间,新命令会先写入aof缓冲区,然后写入aof重写缓冲区,最后追加到新的aof文件里面

你可能感兴趣的:(redis(10)AOF持久化)