RDB持久化
Redis是基于内存的数据库,如果退出进程,数据将会消失,所以我们可以把内存中的数据持久化到磁盘上,下次开启Redis进程的时候,读取磁盘中的数据到内存中,就可以继续正常使用Redis了
RDB持久化是Redis服务器把数据库当前的状态,压缩成一个二进制的RDB文件保存到磁盘.
数据库状态–>RDB文件 RDB文件–>(恢复)数据库状态
因为RDB文件是保存在硬盘上的,就算Redis服务器停止或者宕机,计算机停机,只要RDB文件存在,Redis服务器就可以用它来还原数据库的状态.
RDB文件的创建和载入
Redis有两个命令可以生成RDB文件,
- SAVE
- 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参数
除了saveparams参数外 服务器还维护了一个dirty计数器和一个lastsave属性
dirty用于记录上次(成功)执行BGSAVE/SAVE命令后数据库的修改次数
lastsave用于记录上次(成功)执行BGSAVE/SAVE命令后的Unix时间戳
假设图10-8位当前服务器的状态,在经过了301秒之后(1378271101)服务器会执行一次BGSAVE,因为在300秒内数据库发生了至少10次修改.
假设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文件是否损坏或错误.