Redis——RDB和AOF持久化

Redis——RDB持久化


仅作为笔记,码字不易,转载请标明出处。


前言

仅作为笔记


一、RDB 文件的创建与载入

先了解几个概念:
1)数据库状态:服务器中的非空数据库以及他们的键值对统称为数据库状态。如下图:
在这里插入图片描述

2)Redis是内存数据库,数据要长久必须将其持久化,而RDB持久化指的是将数据库状态转变为一个RDB文件存储在磁盘上,RDB文件是一个可以逆转为数据库状态的压缩过的二进制文件,如下图:
在这里插入图片描述

  • RDB文件的创建:使用SAVE和BGSAVE两个命令可以实现RDB文件的创建。
    1)SAVE方式创建RDB文件会阻塞服务器,服务器停止所有的命令的创建。
    2)BGSAVE方式创建RDB文件是额外创建一个子进程进行RDB文件的创建,父进程(服务器进程)继续处理命令,但是服务器不接受其他的SAVE命令和BGSAVE命令,因为会造成竞争

  • RDB文件的加载:前文提到过,RDB文件是一个压缩了的二进制文件,可以恢复为数据库状态,这个转化为RDB就叫RDB的创建,从RDB恢复到数据库状态就叫做RDB文件的加载持久化文件(AOF和RDB)的加载是由服务器自动完成的,遇到了持久化文件会自动地将其转化为数据库状态

  • 先加载哪个持久化文件:由于AOF文件地更新频率通常比RDB更高,所以通常优先加载AOF文件只有在AOF持久化功能关闭的情况下才会使用RDB来恢复数据库状态。

下面左图为服务器载入文件时的判断,右图是生成持久化文件和加载的示意图。:
在这里插入图片描述

二、自动间隔性保存

  • 概念和使用方法:因为BGSAVE是不阻塞服务器实现持久化工作,那么可以通过设置服务器配置的save选项来设置自动启动条件来自动的执行BGSAVE命令,通过save选项设置的条件中只要有一个满足了。那么就可以运行BGSAVE。
  • 执行条件的维护:使用dirty计数器和lastsave属性,dirty计数器用于记录命令修改了多少次数据库lastsave用于记录服务器上次执行保存操作的时间
  • 执行条件检查:使用serverCron函数默认每隔100毫秒执行一次检查save选项中所保存的条件是否满足了。

三、AOF持久化(宕机了,如何避免数据丢失?)

-AOF 日志正好相反,它是写后日志,“写后”的意思是 Redis 是先执行命令,把数据写入内存,然后才记录日志,如下图所示:
在这里插入图片描述
在这里插入图片描述

四、AOF持久化的实现

AOF持久化的实现分为三步:命令追加、文件写入、文件同步

  • 命令追加:在AFO持久化功能处于打开状态时,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾
  • 文件写入:文件写入就是将之前添加到aof_buf缓冲区的命令写入到AOF文件里面。
  • 文件同步:作用是保证写入的正确(由于在面试和工作中不重要,所以没有再详细的分析)。

五、AOF文件的载入与数据还原

AOF里面保存的是写命令,那么还原数据就需要把AOF中的写命令都执行一遍,而Redis命令只能在客户端上下文中执行,所以创建一个没有网络链接的为客户端进行写命令的执行,直到命令执行完毕,步骤如下:
在这里插入图片描述

六、AOF重写

6.1 重写基本概念

  • AOF记录的是写命令,但是随着运行时间的增长,命令会越来越多,AOF文件会越来越大;
  • 为了解决AOF文件体积膨胀的问题,Redis提供了AOF重写功能:Redis服务器创建一个新的AOF文件来替代现有的AOF文件,新旧两个文件所保存的数据库状态是相同的,但是新的AOF文件不会包含任何浪费空间的冗余命令,通常体积会较旧AOF文件小很多。

6.2 重写实现原理

  • 首先从数据库中读取键现在的值然后用一条命令去记录键值对,代替之前记录该键值对的多个命令。比如有一个名为list的键,里面的值是一条条写入命令弄好的,此时可以不保存每一条单一的写命令,而是用一条包含所有内容的写命令代替。

6.3 后台重写

  • 重写会进行大量的写入操作,所以执行这个操作的线程将被长时间的阻塞,因为Redis服务器使用单线程来处理命令请求;

  • Redis为了解决重写带来的服务器阻塞,所以Redis决定将AOF重写程序放到子进程(后台)里执行
    好处:1)子进程进行AOF重写期间,主进程可以继续处理命令请求;2)子进程带有主进程的数据副本,使用子进程而不是线程,可以避免在锁的情况下,保证数据的安全性。

  • 后台重写可能的问题:子进程在进行AOF重写期间,服务器进程还要继续处理命令请求,而新的命令可能对现有的数据进行修改,这会让当前数据库的数据和重写后的AOF文件中的数据不一致。
    解决方法:增加一个AOF重写缓存,这个缓存在fork出子进程之后开始启用,Redis服务器主进程在执行完写命令之后,会同时将这个写命令追加到AOF缓冲区AOF重写缓冲区保证数据的一致性。简而言之就是将新的写入操作即写入缓冲区也写入重写缓冲区,这样既然两边都有,就没有所谓的数据不一致问题了。

七、重点回顾

  • RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
  • SAVE命令由服务器直接进行保存操作,但是会阻塞服务器
  • BGSAVE由子进程执行保存操作,父进程(服务器)不阻塞。
  • 服务器状态中会保存所有save选项设置的保存条件,当任意一个保存条件满足时,服务器都会自动执行BGSAVE命令。
  • RDB文件是一个经过压缩的二进制文件,由多个部分组成。
  • 对于不同类型的键值对,RDB文件会使用不同的方式来保护他们。
  • AOF文件通过保存所有修改数据库的写命令请求来记录服务器的数据库状态。
  • AOF文件中的所有命令都以Redis命令请求协议的格式保存。
  • 命令请求会先保存到AOF缓冲区里面,之后再定期写人并同步到AOF文件。appendfsync选项的不同值对AOF持久化功能的安全性以及Redis服务器的性能有很大的影响。
  • 服务器只要载人并重新执行保存在AOF文件中的命令,就可以还原数据库本来的状态。
  • AOF重写可以产生一个新的AOF文件,这个新的AOF文件和原有的AOF文件所保存的数据库状态一样,但体积更小
  • AOF重写是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有AOF文件进行任何读人、分析或者写人操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值