除了RDB持久化功能之外,Redis还提供了AOF持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。
服务器在启动时,可以通过载入和执行AOF文件中保存的命令来还原服务器关闭前的数据库状态。
AOF持久化功能的实现可以分为命令追加append、文件写入、文件同步sync三个步骤。
1、服务器在执行完一个写命令后,会议协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾。
2、Redis的服务器进程是一个时间循环,这个循环中的文件事件负责接收客户端的命令请求,以及回复,而时间事件则负责执行定时运行的函数,所以服务器每次结束一个事件循环之前他都会调用flushAppendOnlyFile函数,考虑(appendfsync配置)是否将aof_buf缓冲区的内容写入和保存到AOF文件中。
appendfsync值:always(每个事件循环都要同步将aof_buf中的内容写入AOF文件)、everysec (每秒)、no(每个事件循环都要写,但是时写入系统缓冲区)
AOF数据还原:
1、创建一个不带网络的伪客户端(redis只能在客户端中执行)
2、从APF文件中分析并读出一条写命令3、使用伪客户端执行被读出的写命令4、重复2、3步骤 直到全部处理完成。
AOF重写
为解决AOF文件膨胀问题,Redis创建一个新的AOF文件,两个APF文件保存的数据库状态一样,但是新的AOF文件去掉了冗余的命令。
AOF重写不需要读取旧的AOF文件,而是直接读取数据库中的键值,合并多次写入一个key,保存成一条写入命令。
AOF重写不会阻塞主进程,而是创建一个带有服务器进程的数据副本的子进程,保证在使用锁的情况下数据安全性。
Redis服务器设置有一个AOF重写缓冲区,这个缓冲区是在子进程创建后,Redis主进程每执行一条写命令,同时会将写命令发送到AOF缓冲区和AOF重写缓冲区,保证了AOF在重写时数据同步问题。
AOF重写完成后,向父进程发送信号,父进程将内容写入新的AOF文件,并改名覆盖掉原先的AOF文件,完成新旧文件的替换,在这个过成功,只有信号处理函数执行时 ,服务器进程造成阻塞,AOF后台重写不会阻塞进程。
每天学一点,总会有收获。
说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。
来源:oschina
链接:https://my.oschina.net/u/4408322/blog/4282397