Redis *.rdb
是内存的二进制文件
,通过 *.rdb 能够完全回复 Redis 的运行状态。
![](http://yano.oss-cn-beijing.aliyuncs.com/blog/ 20220218175013.png?x-oss-process=style/yano)
image
详细信息可参考:Redis RDB Dump File Format。
image
image
RDB 文件的头部占用 9bytes,前 5bytes 为 Magic String
, 后 4bytes 为版本号
;
52 45 44 49 53 #"REDIS", 就像 java 的 class 文件以 0xCAFEBABE 开头一样
30 30 30 36 #RDB 版本号,30 表示‘0’,版本号为 0006=6
注意:版本号是字符串而不是整型:
snprintf(magic,sizeof(magic),"REDIS%04d",RDB_VERSION);
RDB_VERSION 详细信息可参考:Redis RDB Version History
FE 开头表示后跟表示 DB Selector
,例如:
FE 00 #FE 表明数据库的哪个 db,此处为 db0
注意:DB Selector 长度不固定,具体的编码方式请参见后文的 Length 编码。
FA 开头表示后跟 AUX Fields, 记录生成 Dump 文件的 Redis 相关信息
,例如 redis-ver、redis-bits、used-mem、aof-preamble 和 repl-id 等。这些信息采用 String 编码;
注意:redis3.0 版本的 RDB 版本号为 6,redis3.2 的版本号为 7;
key-value 有三种格式:
FF #RDB 文件的结束
8byte checksum #循环冗余校验码,Redis 采用 crc-64-jones 算法,初始值为 0
长度采用 BigEndian 格式存储,为无符号整数
该编码方式首先采用 Length 编码 进行解析:
Length 编码
知道,如果以"00","01","10"开头,首先读取长度;然后从接下来的内容中读取指定长度的字符;LZF 编码的解析步骤为:
Length 编码
读取压缩后字符串的长度 clen
;Length 编码
读取压缩前的字符串长度;Redis 中的 value 编码包括如下类型:
image
其中 String 编码在前面已经介绍过,接下来逐一介绍其他的 9 种编码方式;
同 List
用于存储 hashmap,Redis2.6 之后,该编码被废弃,转而采用 Ziplist 编码;
采用 String 编码读取整个 zipmap 字符串,hashmap 字符串的格式为:
<zmlen><len>"foo"<len><free>"bar"<len>"hello"<len><free>"world"<zmend>
采用 String 编码读取整个 ziplist 字符串,字符串的格式为:
<zlbytes><zltail><zllen><entry><entry><zlend>
entry 的格式:
<length-prev-entry><encoding><content>
注意:元素长度、内容长度等都是采用 Little Endian 编码;
Intset 是一个整数组成的二叉树;当 set 的所有元素都是整形的时候,Redis 会采用该编码进行存储;Inset 最大可以支持 64bit 的整数,做为优化,如果整数可以用更少的字节数表示,Redis 可能会用 16~32bit 来表示;注意的是当插入一个长度不一样的整数时,有可能会引起整个存储结构的变化;
由于 Intset 是一个二叉树,因此它的元素都是排序过的; 采用 String 编码读取整个 intset 字符串,字符串的格式为:
<encoding><length-of-contents><contents>
采用 Ziplist 编码,区别在于用两个 entry 分别表示元素和分值;
采用 Ziplist 编码,区别在于用两个 entry 分别表示 key 和 value;
本篇文章在本地安装并启动 Redis 服务,保存一个 string 类型的字符串,save 之后查看保存的 rdb 文件的二进制。
下载见:Redis Download
启动 Redis server:
src/redis-server&
image
启动一个 Redis client:
src/redis-cli
127.0.0.1:6379> set name yano
OK
127.0.0.1:6379> save
80277:M 15 Feb 2022 10:51:07.308 * DB saved on disk
OK
在刚执行 redis-cli 的目录下,就生成了 rdb 文件,文件名是 dump.rdb。
使用 hexedit
命令分析 dump.rdb
文件:
hexedit dump.rdb
dump.rdb 文件内容如下:
image
本篇文章只是分析 rdb 文件的基本结构和格式,只保存了一个最基础的 string。(图画了一个小时😁)RDB 这块的 Redis 源码就不分析了,基本上都是按照这个结构来的。
image
image
Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~
原创不易,希望大家转载时请先联系我,并标注原文链接。