redis之AOF持久化底层实现

推荐书籍:《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的重写;
在这里插入图片描述

发布了11 篇原创文章 · 获赞 3 · 访问量 477

猜你喜欢

转载自blog.csdn.net/weixin_43251033/article/details/105196370