1. 根底
RDB长久化既能够手动执行,也能够依据服务器配置选项定期执行.该性能能够将某个工夫点上的数据库状态保留到一个RDB文件中。RDB长久化性能所生成的RDB文件是一个通过压缩的二进制文件,通过该文件能够还原生成RDB文件时的数据库状态
因为RDB文件是保留在硬盘外面的,所以即便Redis服务器过程退出,甚至运行Redis服务器的计算机停机,但只有RDB文件依然存在,Redis服务器就能够用它来还原数据库状态
2. SAVE命令和BGSAVE命令
有两个Redis命令能够用于生成RDB文件,一个是SAVE,另一个是BGSAVE。
SAVE命令会阻塞Redis服务器过程,直到RDB文件创建结束为止,在服务器过程阻塞期间,服务器不能解决任何命令申请:
和SAVE命令间接阻塞服务器过程的做法不同,BGSAVE命令会派生出一个子过程,而后由子过程负责创立RDB文件,服务器过程(父过程)持续解决命令申请:
和应用SAVE命令或者BGSAVE命令创立RDB文件不同,RDB文件的载入工作是在服务器启动时主动执行的,所以 Redis并没有专门用于载入RDB文件的命令,只有Redis服务器在启动时检测到RDB文件存在,它就会主动载入RDB文件。
以下是我执行save命令后重新启动redis服务控制台打印的信息,能够看到在服务启动的时候回主动加载RDB文件
【注意事项】
因为AOF 文件的更新频率通常比RDB文件的更新频率高,所以:如果服务器开启了AOF长久化性能,那么服务器会优先应用AOF 文件来还原数据
库状态。
只有在AOF长久化性能处于敞开状态时,服务器才会应用RDB文件来还原数据库状态。
当SAVE命令执行时,Redis服务器会被阻塞,所以当SAVE命令正在执行时,客户端发送的所有命令申请都会被回绝。
只有在服务器执行完SAVE命令、从新开始接受命令申请之后,客户端发送的命令才会被解决。
因为BGSAVE命令的保留工作是由子过程执行的,所以在子过程创立RDB文件的过程中,Redis服务器依然能够持续解决客户端的命令申请,然而,在BGSAVE命令执行期间,服务器解决SAVE、BGSAVE、BGREWRITEAOF三个命令的形式会和平时有所不同。
【留神】
1、bgsave命令执行时,客户端的save命令会被服务器回绝
2、在bgsave命令执行时,客户端的bgsave也会被回绝
3、bgrewriteaof和bgsave命令不能同时执行
3. 主动间隔性保留
因为BGSAVE命令能够在不阻塞服务器过程的状况下执行,所以Redis容许用户通过设置服务器配置的save选项,让服务器每隔一段时间主动执行一次BGSAVE命令。
用户能够通过save选项设置多个保留条件,但只有其中任意一个条件被满足,服务器就会执行BGSAVE命令。
上面是redis的配置文件
下面的默认配置形容如下:
只有满足以下三个条件中的任意一个,BGSAVE命令就会被执行:
1:服务器在900秒之内,对数据库进行了至多1次批改
2:服务器在300秒之内,对数据库进行了至多10次批改
3:服务器在60秒之内,对数据库进行了至多10000次批改
如果咱们想要有其余设置,能够自定义批改其配置规定
4. 主动保留条件
Redis 的服务器周期性操作函数serverCron默认每隔100毫秒就会执行一次,该函数用于对正在运行的服务器进行保护,它的其中一项工作就是查看save选项所设置的保留条件是否曾经满足,如果满足的话,就执行BGSAVE命令。
5. RDB文件构造
(1)REDIS
RDB文件的最结尾是REDIS局部,这个局部的长度为5字节,保留着"REDIS"五个字符。通过这五个字符,程序能够在载人文件时,疾速查看所载入的文件是否RDB文件。
(2)db\_version
db version长度为4字节,它的值是一个字符串示意的整数,这个整数记录了RDB文件的版本号,比方"0006”就代表RDB文件的版本为第六版。
(3)databases
databases局部蕴含着零个或任意多个数据库,以及各个数据库中的键值对数据:
(4)EOF
EOF常量的长度为1字节,这个常量标记着RDB文件注释内容的完结,当读入程序遇到这个值的时候,它晓得所有数据库的所有键值对都曾经载入结束了。
(5)check\_num
check\_sum是一个8字节长的无符号整数,保留着一个校验和,这个校验和是程序通过对REDIS、db\_version、databases、EOF四个局部的内容进行计算得出的。服务器在载人RDB文件时,会将载入数据所计算出的校验和与check\_sum所记录的校验和进行比照,以此来查看RDB文件是否有出错或者损坏的状况呈现。
6. 剖析RDB文件
咱们应用od命令来剖析Redis服务器产生的RDB文件,该命令能够用给定的格局转存( dump)并打印输人文件。比如说,给定-c参数能够以ASCII编码的形式打印输出文件,给定–x参数能够以十六进制的形式打印输人文件
Linux od命令用于输入文件内容。
od指令会读取所给予的文件的内容,并将其内容以八进制字码出现进去。
【数据库为空时的rdb文件】
以后是数据状态为空的RDB文件,所以只包含四局部,
1:五个字节的标识位REDIS
2:四个字节的版本号:0006
3:一个字节的EOF常量:377 (ASCII码)
4:八个字节的校验和:334 263 C 360 Z 334 362 V
【执行插入命令后的RDB文件】
其中黄色框内示意是整数0,即数据库0有数据
其中红色框内:
\0 003 msg 005 hello
\0示意的是以后数据的类型,0示意的是字符串
003示意的msg即Key的长度,005示意的是value的长度
msg键,hello示意值