Redis持久化的相关总结

Redis持久化的相关总结

​ Redis是内存数据库,里面存储的是自己的数据库状态,因此为了保证在意外情况下数据库状态的一致性,Redis提供了持久化功能。

1. RDB持久化

​ 该功能就是将某个时间点上的数据库状态保存到一个RDB文件中,RDB文件是一个经过压缩的二进制文件,只要RDB文件存在,Redis服务器就可以用它来还原数据库的状态。

  • RDB文件的创建与载入

    ​ Redis可以使用SAVE / BGSAVE 命令创建RDB文件。两个命令都是用于生成RDB文件。但SAVE命令在执行期间,服务器进程会阻塞,此时服务器无法处理任何其他命令。而BGSAVE命令则是派生出一个子进程,再由这个子进程来负责创建RDB文件,服务器进程继续处理其他的命令。

    ​ Redis没有专门用于载入RDB文件的命令,只要Redis服务器启动时检测到RDB文件的存在,就能够自动载入RDB文件。但是如果服务器也开启了AOF持久化功能(后文会介绍),那么由于AOF文件的更新频率比RDB文件的更新频率高,服务器会优先使用AOF文件来还原数据库状态。在RDB文件的整个载入过程中,服务器会一直处于阻塞状态。

  • RDB文件保存的设置

    用户可以通过指定参数文件或者传入参数的方式设置save选项,如果用户没有自定义save选项,那么服务器会为save选项选择默认条件。分别是:

    save 900 1 		     //服务器在900秒内对数据库进行了至少1次的修改
    save 300 10         //服务器在300秒内对数据库进行了至少10次的修改
    save 60 10000      //服务器在60秒内对数据库进行了至少10000次的修改
    

    ​ 服务器会根据save选项设置的保存条件,设置服务器状态redisServer结构的saveparams属性。其中的saveparams属性是一个数组,数组中的每个元素都是一个saveparams结构,每个saveparams结构保存的是一个save选项设置的条件。

    ​ 此外服务器状态还有一个dirty计数器(记录距离上一次成功执行SAVE命令或者BGSAVE命令后,服务器对于数据库状态进行修改的次数)和lastsave属性(如同字面属性,记录了服务器上一次成功执行SAVE / BGSAVE命令的时间)。

    ​ Redis可以通过(当前时间 - lastsave)和dirty计数器的计数,再结合save选项的条件可以实现间隔性保存的功能。

  • RDB文件的结构

    REB文件可以分为以下五个部分:
    在这里插入图片描述

    REDIS:长度为5个字节,标志符,用于辨识是否是RDB文件。

    db_version:长度为4个字节,用于标志RDB文件的版本号。

    databases:长度不定,包含0个或者多个数据库以及每个数据库中所有的键值对数据。

    EOF:长度为1个字节,标志着RDB文件正文内容的结束。

    check_sum:长度为8个字节,校验和。

    下面对databases部分进行分析:

    在这里插入图片描述

    databases如果包含0个数据库,即为空;如果存在非空数据库,结构又可以细分为下:

    SELECTDB:长度为1个字节,标志符。

    db_number:长度不定,可为1/2/5个字节,表示数据库编号。

    key_value_pairs:长度不定,保存了部分键值对数据。如果键值对中带有过期时间,则也会包含过期时间。 key_value_pairs又可以分为带过期时间的键值对和不带过期时间的键值对。主要是分为TYPE、key、value的基本键值对信息和可选择的过期时间信息EXPIRETIMR_MS(长度为1个字节的标志符)和ms(过期时间)。

    2. AOF持久化

    ​ AOF(Append Only File)持久化是通过存储Redis服务器所执行的写命令来记录数据库状态信息的。具体可以分为命令追加、文件写入和文件同步三个部分。

    • 命令追加

      ​ 当AOF持久化功能打开的时候,服务器在执行完一个写命令后,会以协议的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。

    • 文件写入与同步

      ​ 服务器在执行完一个事件时,会调用flushAppendOnlyFile函数考虑是否将aof_buf缓冲区中的内容写入和保存到AOF文件中。flushAppendOnlyFile函数的行为由服务器配置的appendfsync决定。分别为always(服务器每次结束时间循环时都会将aof_buf缓冲区中的所有内容写入AOF文件中并同步AOF文件)、everysec(服务器每次结束时间循环时都会将aof_buf缓冲区中的所有内容写入AOF文件中并每隔1秒钟就同步AOF文件)和no(服务器每次结束时间循环时都会将aof_buf缓冲区中的所有内容写入AOF文件中,但同步AOF文件则由操作系统控制)三个值。

      AOF文件的载入和还原过程

      ​ 服务器启动载入程序,此时创建一个没有联网的伪客户端,然后从AOF文件中分析并读取一条写命令并在此客户端上执行。最后每读取完一条命令就要做一个判断,AOF文件中的所有写命令是否被执行完毕,如果完毕则结束,如果没有则继续从AOF文件中读取命令。

      AOF重写

      ​ 由于AOF文件中存储的是服务器的每条写命令,随着时间的增长,命令越来越多,AOF文件的体积也会越来越大。这时,Redis提供了重写的功能(rewrite),此功能就是Redis重新创建一个AOF文件来代替原有文件。

      ​ 具体的实现过程如下:Redis通过读取现有数据库的状态,从数据库中读取键现在的值,然后用一条命令来代替之前冗余的多条命令。在重写的过程中,由于重写的时候在子程序中进行,此时父进程可能还会有其他的命令继续执行,为了解决这个问题,Redis又提供了一个AOF重写缓冲池用于记录重写期间收到的其他命令。这样的话,AOF文件在重写完成后,再接收AOF重写缓冲区中的内容,最后改名后直接覆盖原有文件即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值