前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis源码阅读之rdb.c

Redis源码阅读之rdb.c

作者头像
chain
发布2018-08-02 15:00:14
6020
发布2018-08-02 15:00:14
举报

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文件,列举旧版本对象的读取方式(略)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年05月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档