github 原文
使用 markdown 阅读会更好些。
吐槽下知乎 markdown 不支持表格。
dalei2019/redis-studygithub.com以下为正文。
redis rdb 文件格式详解
redis rdb 文件是 redis 在内存中所存储全部数据的二进制表示,结构非常紧凑。
在 redis 初始化或者迁移时,加载该文件,可以快速恢复原存储数据到 redis。
对作者来说了解 redis rdb 文件编码算法,对于学习二进制文件处理、压缩编码算法甚至合并或恢复损坏的 rdb 文件都很有帮助。
本文主要翻译自 redis-rdb-tools 的作者关于 rdb 文件格式的经典剖析,并在此基础上增加部分细节和示例。
文件整体结构
rdb 文件整体上可分为三个区域:头信息区、数据区、尾信息区。
描述符号约定
列出本文中用到的演示符号及其含义。
-/./空格/换行/行首数字 # 只为增加展示效果,实际编码中没有
52 45 44 49 53 # 示例数据为16进制
FE/FD/FA... # 示例数据中的此类十六进制值代表 redis 的特殊操作符,参考「redis 操作符列表」
$xxxx # 代表一种数据类型或者编码格式,会在第二节进一步讲解
[] # 代表括号所选的范围是可选的,非必须存在
操作符列表
redis 操作符是一类特殊标记符。
通常用来揭示紧跟其后或之前的一段字节流的存储的内容类型。
redis 支持的操作符列表(第7版):
Byte | Name | Description |
---|---|---|
0xFF | EOF | rdb 文件结束符 |
0xFE | SELECTDB | redis 过期时间,使用秒表示。 |
0xFD | EXPIRETIME | redis 过期时间,使用秒表示。 |
0xFC | EXPIRETIMEMS | redis 过期时间,使用毫秒表示。 |
0xFB | RESIZEDB | redis dbsize,描述 key 数目和设置了过期时间 key 数目 |
0xFA | AUX | redis 元属性,可以存储任意的的 key-value 对 |
头信息区
头信息区用于描述 rdb 文件,如 rdb 版本、redis 版本、rdb 创建时间等信息。
该头信息在 redis 启动加载时会做校验,校验失败则不会加载数据区。
---------------------------- # rdb 是二进制格式,示例数据增加换行、空格、"-" 只是为解释方,实际编码中没有。示例数据均为16进制
52 45 44 49 53 # ascii值对应 "REDIS" 魔数字符
30 30 30 37 # rdb 格式版本,示例值对应 ascii 码 0007 ,描述 rdb 格式为第7版
FA $字符串编码的key $字符串编码的value # AUX 指令,描述 redis 属性,可存在多个 key-value 组合
数据区
rdb 文件实际数据存放区。也是编码最复杂的位置。采用数十种不同编码方法。
---------------------------- # 开始存储数据
FE 00 # FE 指定数据库编号,示例值 "00" 表示接下来是第 0 个库的数据。
FB $整数编码的数1 $整数编码的数2 # RESIZEDB 指令,描述总的 key 个数以及,有过期时间的 key 个数
-----------------