Redis持久化详解
zhaolengquan Lv3

RDB持久化

Redis是基于内存的数据库,如果退出进程,数据将会消失,所以我们可以把内存中的数据持久化到磁盘上,下次开启Redis进程的时候,读取磁盘中的数据到内存中,就可以继续正常使用Redis了

RDB持久化是Redis服务器把数据库当前的状态,压缩成一个二进制的RDB文件保存到磁盘.

数据库状态–>RDB文件 RDB文件–>(恢复)数据库状态

因为RDB文件是保存在硬盘上的,就算Redis服务器停止或者宕机,计算机停机,只要RDB文件存在,Redis服务器就可以用它来还原数据库的状态.

RDB文件的创建和载入

Redis有两个命令可以生成RDB文件,

  1. SAVE
  2. BGSAVE

他们的区别是:

SAVE命令会阻塞Redis服务器,直到RDB文件生成之后才能处理其他命令请求

BGSAVE命令会在后台fork出一个子进程,然后子进程用于生成RDB文件,Redis服务器仍然可以处理命令请求

BGSAVE采用轮询等待的方式 等待子进程的信号(生成RDB结束)

RDB文件的载入没有专门的命令执行, 只要Redis服务器在启动的时候检测到RDB文件的存在,就会自动载入RDB文件.

因为AOF的更新频率比RDB文件高

如果服务器开启了AOF功能,Redis服务器启动的时候就不会载入RDB文件,优先使用AOF文件还原数据库

只有在AOF功能处于关闭状态时,才会默认载入RDB文件

在BGSAVE命令的执行过程中,处理SAVE,BGSAVE,BGREWRITEAOF命令的方式也不同

在Redis服务器执行BGSAVE的过程中,因为SAVE和BGSAVE, BGSAVE和BGSAVE都存在竞争关系,所以Redis服务器会拒绝SAVE和BGSAVE的请求

其次BGSAVE和BGREWRITEAOF命令不能同时执行 如果当前是BGSAVE状态, BGREWRITEAOF将会等到BGSAVE执行后在执行

如果当前是BGREWRITEAOF状态,服务器将会拒绝BGSAVE命令

服务器在载入RDB文件的过程中 会一直处于阻塞状态,知道RDB文件载入完成

自动间隔性保存

Redis允许用户通过配置save选项,让服务器每隔一段时间自动运行BGSAVE命令

save配置文件

save 900 1

save 300 10

save 60 10000

当只要满足三个条件之一,服务器就会执行BGSAVE命令

  • 900秒内至少1次修改
  • 300秒内至少10次修改
  • 60秒内至少10000次修改

服务器会根据save选项设置RedisServer结构的saveparams参数

image-20220402162652699

除了saveparams参数外 服务器还维护了一个dirty计数器和一个lastsave属性

dirty用于记录上次(成功)执行BGSAVE/SAVE命令后数据库的修改次数

lastsave用于记录上次(成功)执行BGSAVE/SAVE命令后的Unix时间戳

image-20220402163314629

假设图10-8位当前服务器的状态,在经过了301秒之后(1378271101)服务器会执行一次BGSAVE,因为在300秒内数据库发生了至少10次修改.

image-20220402163610235

假设BGSAVE命令5秒后执行完成,现在数据库的状态是 dirty计数器被重新置为0, 当前lastsave时间戳被更新为1378271106(1378271101+5)

RDB文件结构

Redis(5字节) db_version(4字节) data_bases EOF(1字节) check_num(8字节)

文件头部的Redis部分为5个字节保存着”Redis” 这五个字符,通过这5个字符可以快速的检查当前文件是否是RDB文件

db_version长度为4字节,记录的是RDB的默认版本号 例”0006”

data_bases包含0个或任意个redis数据库

EOF为1字节,当读到EOF时标志着RDB文件正文内容的结束

check_num是8字节的无符号整数,保存的是一个校验和,check_num的数值是由REDIS,db_version,data_bases,EOF四个部分计算出来的, 作用是可以校验RDB文件是否损坏或错误.

 Comments