RDB文件结构
1、如何保存长度
rdbSaveLen函数说明了RDB文件中如何保存长度
如果开头两位是00,那么就表示后面的6位保存的是长度,长度最大值63
如果开头两位是01,那么就表示后面的14位保存的是长度,长度最大就是2^14-1
如果开头两位是10,那么后面6位空着,接下来的32位表示长度,最大值2^32-1
2、如何保存整数
如果开头两位是11时候,表明后面就是特殊的编码对象,举例来说,如果是整数的话,
后面的6位用来表示有符号整数的范围,整数分别有1,2,4字节表示
3、如何保存字符串
1、如果服务器打开了RDB文件压缩功能,那么在保存RDB文件的时候就会使用
压缩格式保存,压缩格式如下:
REDIS_RDB_ENC_LZF |compressed_len | original_len | compressed_string
其中REDIS_RDB_ENC_LZF会和11放在第一个字节中
2、如果服务器没有开启RDB文件压缩功能,那么首先如果长度小于等于11,就考虑能够能不能转换成整数编码,
如果可以就返回整数编码长度;如果编码长度大于20,就是用压缩字符串编码;其他情况的话,就是直接将长度
和字符串对象写入RDB文件中。
4、返回不同的保存对象类型或是编码类型
5、保存不同类型的对象
底层编码是双端链表,那就只能比那里链表所有节点,然后保存每一个节点
list_length | item1 | item2 | item 3 | …
2、对象类型是集合
底层编码是字典,那么遍历所有的key(value不保存信息)
set_size | elem1 | elem2 | elem3
底层编码是整数集合,那么直接写入RDB文件
3、对象类型是有序集合
底层编码是压缩列表,那么直接写入RDB文件(同上)
底层编码是跳跃表,那么就是遍历跳跃表最底层的链表,然后保存每一个节点值和分值
4、对象类型是哈希表
底层编码是压缩列表,那么直接写入RDB文件(同上)
底层编码是字典,保存每一个键值对
6、同步执行rdb文件保存
RDB文件结构的开头包含9个字节的魔数,首先会被写入
'R' 'E' 'D' 'I' 'S' "0006"(四个字节的版本号)
遍历服务器中的所有数据库,针对每一个数据库,写入数据库标志和编号,然后再遍历该
数据库中的所有extry,将键值对写入RDB文件中
写入数据结尾标志EOF
最后计算校验和,然后写入文件尾
对缓冲区的RDB文件flush到硬盘上
然后对临时文件进行重命名,去掉原始
7、后台执行RDB文件保存
子进程RDB文件保存
父进程打印子进程执行RDB文件保存信息,同时更新数据库dict的resize策略,使得子进程能够更早的执行完
8、RDB文件加载对象
针对所有的对象类型和编码类型,列举了所有的读取对象的方式
为了兼容旧版本的RDB文件,列举旧版本对象的读取方式(略)