不适合直接手写C++解析器,因RDB是版本不兼容、含LZ4压缩与校验和的二进制格式,官方不保证格式稳定;推荐复用redis-server --rdb命令转换为可读文本流再解析。

Redis RDB文件结构是否适合C++直接解析
不适合直接手写解析器。RDB不是文本协议,而是二进制序列化格式,且版本间不兼容(如 Redis 6 的 RDB_VERSION 是 9,Redis 7 是 10),还包含校验和、LZ4压缩块、非对齐内存布局等细节。官方明确不承诺 RDB 格式稳定,rdb.h 也未公开导出解析接口。
用redis-server --rdb命令导出为可读格式
最稳妥的方案是复用 Redis 自身工具链,避免逆向工程。Redis 从 3.2 起内置 --rdb 参数,能将 RDB 文件转换成人类可读的文本流:
redis-server /path/to/dump.rdb --rdb /dev/stdout
输出类似:
SELECTDB 0 SET key1 "hello" EXPIREAT key1 1717023456
你的 C++ 程序只需:
立即学习“C++免费学习笔记(深入)”;
- 用
popen()或std::process(C++26 前需第三方库如boost::process)执行该命令 - 逐行读取 stdout,按空格分割首字段识别命令类型(
SET、HSET、EXPIREAT等) - 注意:
SELECTDB行表示数据库切换,后续键值属于该db编号 - 过期时间是 Unix 秒级时间戳,不是相对 TTL
遇到 LZ4 压缩的 RDB 文件怎么办
Redis 7+ 默认启用 LZ4 压缩(redis.conf 中 rdb-compression yes)。此时 redis-server --rdb 仍能正确解压并输出明文——你无需额外集成 LZ4 库。
但若想跳过 redis-server 直接处理原始 RDB 字节流,必须:
- 先读 9 字节魔数
"REDIS0010"(末两位是版本) - 定位到
OPCODE_COMPRESSED_ZSTD或OPCODE_COMPRESSED_LZ4(RDB 10 引入) - 提取压缩块长度、原始长度,调用对应解压库(如
lz4.h的LZ4_decompress_safe()) - 错误常见于:未检查返回值导致缓冲区溢出;忽略 RDB 中的校验和(
REDIS_RDB_CHECK_SUM字段)
用 hiredis 或 redis-plus-plus 能否解析 RDB
不能。hiredis 和 redis-plus-plus 都是 Redis 协议客户端库,只处理 RESP(REdis Serialization Protocol)网络通信,与本地 RDB 文件格式完全无关。它们无法打开 dump.rdb 文件,也不提供任何 RDB 解析函数。
如果你看到某些项目声称“用 hiredis 读 RDB”,大概率是混淆了:
-
redis-cli --rdb(客户端工具,本质调用 redis-server 逻辑) - 或自己实现了 RDB 解析器,但和 hiredis 无代码依赖关系
RDB 解析的核心难点从来不在 C++ 语法,而在紧跟 Redis 源码中 rdb.c 的实现演进——每次小版本更新都可能调整 opcode 或字段顺序。直接依赖 redis-server 工具,是最省心也最可持续的方式。


















