RDB持久化

RDB持久化??

一.问题??

因为Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态保存到磁盘里面,那么一旦服务器推出,服务器中的数据库状态也会消失不见

二.解决??

RDB持久化,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失

①RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点上的数据库状态保存到一个RDB文件中

②RDB持久化所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态

RDB持久化

三.RDB文件的创建和载入??

用于生成RDB文件的两个命令:SAVE和BGSAVE

①SAVE

当SAVE命令执行时,Redis服务器会被阻塞所以当SAVE命令正在执行时,客户端发送的命令请求都会被拒绝。只有在服务器执行完SAVE命令、重新开始接受命令请求之后,客户端发送的命令才会被处理

②BGSAVE

因为BGSAVE命令的保存工作是由子进程执行的,所以在子进程创建RDB文件的过程中,Redis服务器仍然可以继续处理客户端的命令请求,但在BGSAVE命令执行期间,服务器处理SAVE、BGSAVE、BGREWRITEAOF和平时有所不同

(1)BGSAVE命令执行期间,客户端发送的SAVE命令会被服务器拒绝,避免同时执行rdbSAVE调用,防止产生竞争条件

(2)BGSAVE命令执行期间,客户端发送的BGSAVE命令也会被拒绝,防止产生竞争条件

(3)BGSAVE命令执行期间,BGREWRITEAOF和BGSAVE两个命令不能同时执行

-客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行

-BGREWRITEAOF命令正在执行,那么客户端发送的BGSAVE命令会被服务器拒绝

③RDB文件载入时的服务器状态

服务器在载入RDB文件期间,会一直处于阻塞状态,知道载入工作完成为止

四.自动间隔性保存??

1.由于BGSAVE命令可以在不阻塞服务器进程的情况下执行,所以Redis允许用户通过设置服务器配置的save选项,服务器每隔一段时间自动执行以此BGSAVE命令

save命令可设置多个保存条件,举例

RDB持久化

只要满足其中一个,BGSAVE就会被执行,900S内至少进行1次修改,300秒内至少10次修改

1.设置保存条件

①设置save选项

当Redis服务器启动时,用户可以通过指定配置文件或者传入启动参数的方式设置save选项,如果用户没有主动设置save选项,那么服务器会为save选项设置默认条件:

RDB持久化

②设置saveparams属性

接着,服务器会根据save选项所设置的保存条件,设置服务器状态redisServer结构的saveparams属性:

RDB持久化

(1)saveparams属性是一个数组,数组中每个元素都是一个saveparam结构,每个结构都保存了一个save选项设置的保存条件

RDB持久化

举例:

RDB持久化

2.dirty计数器和lastsave属性

除了saveparams数组之外,服务器状态还维持着一个dirty计数器,以及一个lastsave属性:

RDB持久化

3.检查保存条件是否满足

Redis的服务周期操作函数serverCron默认每隔100毫秒就会执行一次,该函数用于对正在运行的服务器进行维护,它的其中一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足的话,就执行BGSAVE命令

五.RDB文件结构??

RDB持久化

注意:

为了方便区分变量、数据、常量,用全大写单词标示常量,用全小写单词标示变量和数据

①“REDIS”,通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否为RDB文件

②db_version,版本号

③databases部分包含着零个或任意多个数据库,以及各个数据库中的键值对数据

④EOF常量的长度为1字节,这个常量标志着RDB文件正文内容的结束,当读入程序遇到这个值时,它知道所有数据库的所有键值对都已经载入完毕了

⑤check_sum是一个8字节长的无符号整数,保存着一个校验和,这个校验和时程序通过前面四个部分的内容计算得出的,在载入RDB文件时,会将载入数据所计算出的校验和与chek_sum所记录的校验和进行对比,一次来检查RDB文件是否有出错或者损坏的情况

1.databases部分

一个RDB文件的databases部分可以保存任意多个非空数据库

每个非空数据库都可已保存为SELECTDB、db_number、key_value_pairs三个部分

RDB持久化

①SELECTDB常量的长度为1字节,当读入程序遇到这个值的时候,它知道接下来要读入的将是一个数据库号码

②db_number保存着一个数据库号码,根据号码的大小不同,这个部分长度可以是1、2、5字节.当程序读入db_number部分之和,服务器会调用SELECT命令,根据读入的数据库号码进行数据库切换,使得之后读入的键值对可以载入到正确的数据库中

③key_value_pairs部分保存了数据库中的所有键值对数据,如果键值对待有国企hi将,那么过期时间就会和键值对保存在一个。根据键值对的数量、类型、内容以及是否有过期时间等条件不同,它的长度会有所不同

2.key_value_pairs部分

RDB文件中的每个key_value_pairs部分都保存了一个或以上数量的键值对,如果键值对有过期时间的话,那么键值对的过期时间也会被保存在内

其中可以是以下常量的其中一个:

RDB持久化

3.value的编码

RDB文件中的每个value部分都保存了一个值对象,每个值对象的类型都由与之对应的TYPE记录,根据类型的不同,value部分的结构、长度会有所不同

①字符串对象

②列表对象

③集合对象

④哈希表对象

⑤有序集合对象

⑥INTEST编码的集合

⑦ZIPLIST编码的列表、哈希表或者有序集合

六.分析RDB文件??

1.不包含任何键值对的RDB文件

RDB持久化

当一个RDB文件没有包含任何数据库数据时,这个RDB文件将由以下四个部分组成

RDB持久化

2.包含字符串键的RDB文件

RDB持久化

这时有三部分组成

RDB持久化

RDB文件中,没有过期时间的键值对由类型(TYPE)、键(KEY)、值(VALUE)三部分组成:其中类型的长度为一字节,键和值都是字符串对象,并且字符串对象在未被压缩前,都是以字符串长度为前缀,后跟字符串内容本身的方式来存储的

RDB持久化

3.包含多有过期时间的字符串键的RDB文件

RDB持久化

4.包含一个集合键的RDB文件

RDB持久化

七.重点??

RDB持久化

RDB持久化

上一篇:P6Spy监控你的Spring boot数据库操作


下一篇:odoo里面批量上传图片