推荐书籍:《Redis设计与实现》
一,AOF持久化简单介绍
1,RDB持久化:保存数据库键值对到文件中,来达到持久化的目的;
2,AOF持久化:保存redis服务器执行的写命令到文件中,来到达持久化的目的;
3,AOF文件
通过AOF进行持久化操作,会将所有的写命令保存在AOF结尾的文件中;命令保存的格式是存文件形式,因此我们可以直接打开AOF文件查看;如下所示,就是一个AOF文件展示的内容;
二,AOF持久化的实现
1,命令追加
当我们打开AOF持久化方式的时候,当redis服务器执行了一个写命令的时候,会将该命令添加到AOF缓存区中;该缓冲区主要就是用于存储所有的写命令,用于AOF的持久化动作;
2,AOF文件写入和同步
写入:就是将aof_buf缓存中的命令写入到AOF文件中;注意此时只是写到了内存中,并没有写入到磁盘中;
同步:将AOF文件的内容保存到磁盘上;这一步是将内存上的内容保存到了磁盘上;
a,Redis服务进程所做的内容
b,写入参数的配置
a,always:服务器每个时间循环,都会要将buf缓存区上命令写入到AOF文件中,并且同步AOF文件;
优点:安全性最高;redis服务区出现故障,丢失的话,也就丢失一条命令;
缺点:效率低;因为每次谢明令都会执行AOF文件的写入和同步,非常耗费资源;
b,everysec:服务器每个时间循环,都会要将buf缓存区上命令写入到AOF文件中,每隔一秒同步AOF文件;
优点:这是一种折中策略,安全性和效率的折中;
c,no:服务器每个时间循环,都会要将buf缓存区上命令写入到AOF文件中,同步操作有操作系统决定;
优点:效率高;
缺点:安全性不好;
三,AOF文件的载入与数据还原
1,载入和数据还原的过程
四,AOF的重写
1,引入原因
随着redis服务器不断的运行,写入到AOF文件的命令会不停的增加,那么就会导致AOF体积不断膨胀,这样在使用AOF进行数据还原的时候,那么就会很慢,因此引入了AOF重写;
2,重写的实现原理
他不会对原有的AOF文件进行分析,而是直接对数据库现在的状态进行分析,来获取到数据库中现在存有的元素,然后在将元素对象的创建命令保存到AOF文件中;
3,问题
a,问题1:AOF的重写使用的主进程还是子进程呢?
b,问题2:使用子进程的话,那么redis的主进程还可以执行客户端的写命令操作,那么可能会导致AOF文件中保存的内容和数据库中保存的内容是不一致的,这个问题怎么解决?
4,AOF重写的过程
a,使用子进程完成AOF重写,因为redis不希望在重写期间阻塞客户端传过来的命令;
b,在调用子进程进行AOF重写的时候,就会创建一个AOF重写缓冲区,用来缓冲这一段时间客户端向redis服务器发送的写命令;
c,等到AOF子进程重写完毕,那么就会告诉服务器,服务器在将AOF缓冲区中的命令写入到AOF文件中;
d,最后使用新的AOF文件替代原先的AOF文件,完成AOF的重写;