RDB持久化是一种类似于快照的持久化方式,RDB持久化既可以通过手动触发,有可以通过配置选项定期执行。RDB持久化的结果是一个经过压缩的二进制文件,只要RDB文件存在,Redis服务器就可以用它来还原数据库。
1.RDB文件的创建和载入
RDB文件的创建主要分为手动触发和配置文件触发。
- 手动触发主要依靠SAVE命令和BGSAVE命令。SAVE命令会阻塞服务器,BGSAVE命令会创建一个子进程,由子进程创建RDB文件,因此没有阻塞服务器的问题(但BGSAVE命令执行期间,客户端发送的SAVE和BGSAVE命令会被服务器拒绝,而BGREWRITEAOF命令(异步执行一个AOF文件重写操作)会被延迟到BGSAVE完成之后执行)。
- 配置文件触发RDB的创建主要是依靠配置文件的save选项,当满足save选项的时候,会触发一次BGSAVE命令
eg:save 900 1
save 300 10
save 60 10000
(
服务器在900秒之内,对数据库进行了至少1次修改,
服务器在300秒之内,对数据库进行了至少10次修改,
服务器在60秒之内,对数据库进行了至少10000次修改,
)只要满足以上三个条件任何一个,就会触发BGSAVE命令
Redis会根据save选项设置服务器状态的redisServer结构的saveParams属性,saveParams属性是一个数组,数组中的每一个元素都是一个saveparam结构:
- time_t seconds: 秒数
- int changes:修改数
Redis的服务器周期性函数serverCron每隔100毫秒就会执行一次,它的其中一项工作就是检查save参数是否满足,满足则会执行BGSAVE命令。
除此之外,服务器状态还维持着一个dirty计数器和lastsave属性: - dirty计数器记录距离上次执行SAVE或者BGSAVE命令,服务器对数据库状态进行了多少次修改
- lastsave是一个unix时间戳,记录上次成功执行SAVE,BGSAVE命令时间
RDB文件的载入:
RDB文件的载入是在服务器启动时自动执行的。(注意:AOF文件的优先级大于RDB,当由AOF文件存在时,服务器会优先使用AOF文件来还原服务器),载入RDB文件时,系统会一直阻塞。
2.RDB文件结构
RDB文件的结构主要分为5个部分:
- REDIS:5字节,保存着"REDIS"五个字符,用于快速检验文件是否为RDB文件。
- db_version:4字节,记录RDB文件版本号
- databases: 包含0或任意多个数据库,以及各个数据库中的键值对数据。
- EOF常量,标志RDB正文结束
- check_sum:8字节长无符号整数,检验和
Databases部分:
- SELECTDB: 一字节常量,标明下面将要读入的值为一个数据库号码
- db_number:数据库号码,可以为一字节,两字节或五字节。
- key_value_pairs部分:保留数据库的所有的键值对数据。
key_value_pairs部分:
key_value_pairs部分保存一个或以上的键值对。存储键值对的方式依据键值对是否包含过期时间分为两类。
不带过期时间的键值对:
- type:存储value的类型,是类型常量(字符串,列表,集合,有序集合,hash,压缩列表,整数集合,压缩列表组成的有序集合,压缩列表组成的hash中的一个)
- key:保存键,一个字符串对象。
- value:保存值,根据type的不同,存储方式也不同。
包含过期时间的键值对:
除了type,key,value三个字段外,还另外有EXPIRETIME_MS ms两个字段
- EXPIRETIME_MS: 一字节常量,标识接下来读入的是一个以毫秒为单位的过期时间。
- ms:8字节长带符号整数,记录着一个以毫秒为单位的UNIX时间戳。这个时间戳就是过期时间。