Redis *.rdb 是内存的二进制文件,通过 *.rdb 能够完全回复 Redis 的运行状态。


详细信息可参考:Redis RDB Dump File Format。


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 有三种格式:
expire 为 second
FD $unsigned int #失效时间(秒),4 个字节$value-type #1 个字节,表明数据类型:set,map 等$string-encoded-key #key 值,字符串类型$encoded-value #value, 编码方式和类型有关expire 为 millisecond
FC $unsigned long #失效时间(毫秒),8 个字节$value-type #数据类型,1 个字节$string-encoded-key #key,字符串类型$encoded-value #value, 编码方式和类型有关无 expire
$value-type #数据类型,1 个字节$string-encoded-key #key,字符串类型$encoded-value #value, 编码方式和类型有关FF #RDB 文件的结束8byte checksum #循环冗余校验码,Redis 采用 crc-64-jones 算法,初始值为 0长度采用 BigEndian 格式存储,为无符号整数
该编码方式首先采用 Length 编码 进行解析:
Length 编码知道,如果以"00","01","10"开头,首先读取长度;然后从接下来的内容中读取指定长度的字符;LZF 编码的解析步骤为:
Length 编码读取压缩后字符串的长度 clen;Length 编码读取压缩前的字符串长度;Redis 中的 value 编码包括如下类型:

其中 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&
启动一个 Redis client:
src/redis-cli127.0.0.1:6379> set name yanoOK127.0.0.1:6379> save80277:M 15 Feb 2022 10:51:07.308 * DB saved on diskOK在刚执行 redis-cli 的目录下,就生成了 rdb 文件,文件名是 dump.rdb。
使用 hexedit 命令分析 dump.rdb 文件:
hexedit dump.rdbdump.rdb 文件内容如下:

本篇文章只是分析 rdb 文件的基本结构和格式,只保存了一个最基础的 string。(图画了一个小时??)RDB 这块的 Redis 源码就不分析了,基本上都是按照这个结构来的。


最简洁的 Redis 源码剖析系列文章
Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~
原创不易,希望大家转载时请先联系我,并标注原文链接。