redis rdb文件格式&解析

Redis的RDB文件是二进制格式的持久化文件,解析需按特定结构逐字节处理。以下是解析的关键步骤和要点:


1. RDB文件整体结构

[魔数(5字节)] [RDB版本(4字节)] [数据库数据区] [0xFF] [校验和(8字节)]

  • 魔数:固定为REDIS(十六进制52 45 44 49 53)。
  • 版本号:如0006表示RDB版本6。
  • 数据库数据区:包含多个数据库的数据(0~N号库)。
  • 结束符0xFF标记文件主体结束。
  • 校验和:CRC64校验值(可选,Redis 5.0+默认开启)。

2. 数据库数据区解析

每个数据库以0xFE开头,后接数据库编号(变长编码),然后是该库的键值对数据:

0xFE [数据库编号] [键值对1] [键值对2] …


3. 键值对解析

每个键值对结构如下:

[过期时间(可选)] [LRU/LFU信息(可选)] [类型(1字节)] [键] [值]

3.1 过期时间
  • 秒级过期0xFD + 4字节小端时间戳。
  • 毫秒级过期0xFC + 8字节小端时间戳。
3.2 LRU/LFU元数据(Redis 4.0+)
  • LRU0xFA + 4字节LRU时钟。
  • LFU0xFB + 1字节频率计数器。
3.3 数据类型(常见类型)
类型值类型名称结构描述
0String直接存储字符串
1List元素数量 + 连续多个值
2Set元素数量 + 连续多个值
3ZSet元素数量 + (成员+分数)对
4Hash元素数量 + 连续多个(field-value)
9Zipmap压缩编码的Hash
11Quicklist基于ziplist的链表

4. 键和值的长度编码

Redis使用变长编码(Length-Encoded)存储长度:

  • 高位两位决定编码方式
    • 00: 后6位表示长度(0~63)。
    • 01: 后6位 + 1字节 = 14位长度(64~16383)。
    • 10: 后6位丢弃,用后续4字节小端整数(大长度)。
    • 11: 特殊编码(如整数存储为后续字节)。

5. 解析工具推荐

  • 命令行工具
    • redis-check-rdb(Redis自带,检查文件完整性)。
    • hexdump -C dump.rdb(查看二进制内容)。
  • 第三方库
    • Pythonrdbtools(生成JSON或内存报告)。
    • Gogithub.com/HDT3213/rdb(高性能解析库)。
  • 在线工具:http://rdb.redisinsight.dev/(可视化解析)。

6. 手动解析示例(Python片段)

with open(“dump.rdb”, “rb”) as f:
# 读取魔数和版本
magic = f.read(5) # b’REDIS’
version = int(f.read(4)) # 0006 -> 6

while True:
    byte = f.read(1)
    if not byte:
        break
    if byte == b'\xFE':  # 新数据库
        db_number = decode_length(f)
    elif byte == b'\xFF':  # 文件结束
        break
    else:
        # 处理键值对(需解析过期时间、类型、键、值)
        pass

注意事项

  • 版本兼容性:不同Redis版本的RDB格式可能不同(如RDB版本6对应Redis 4.0+)。
  • 压缩:字符串可能用LZF压缩(头部标识0xFA,需解压)。
  • 校验和:若启用,需验证CRC64校验和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值