《Redis设计与实现》第十章总结二:RDB文件结构

本文详细介绍了Redis RDB文件的结构,包括REDIS标识符、db_version、databases部分、EOF、check_sum以及各个关键部分的详细内容。RDB文件包含数据库标识符、版本号、数据库键值对数据,键值对的过期时间和类型等信息。通过分析RDB文件,可以理解Redis如何存储和恢复数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Redis设计与实现》第十章总结一:RDB原理

2.3 RDB文件结构

完整的RDB文件结构:
在这里插入图片描述
全大写代表常量,全小写代表变量和数据

2.3.1 各部分概述
  • REDIS

作用:RDB文件标识符。通过这五个字符,程序可以在载入文件时,快速检查所载入的文件是否为RDB文件

长度:5字节,保存REDIS这五个字符

  • db_version

作用:RDB文件的版本号。如0006代表第六版,为此次介绍的RDB文件结构的版本号

长度:4字节,值是一个字符串表示的整数

  • databases

作用:包含0或多个数据库及其对应的键值对数据

长度:如果服务器数据库状态为空,则为0;如果不为空,则根据键值对的数量、类型和内容,长度也随之而变

  • EOF

作用:RDB文件结束符。标志着RDB文件正文内容的结束,读入程序遇到这个值时,代表所有数据库的所有键值对都载入完毕了

长度:1字节

  • check_sum

作用:检查RDB文件是否有出错或损坏。是程序通过对REDIS、db_version、databases、EOF四个部分的内容进行计算而出的;载入RDB文件时,会将载入数据所计算出的校验和与check_sum进行对比,从而得出是否出错

长度:8字节的无符号整数

2.3.2 RDB#databases部分

结构:
在这里插入图片描述

  • SELECTDB

作用:数据库标识符,当读入程序遇到此值,它知道接下来要读入的是一个数据库

长度:1字节

  • db_number

作用:数据库号码。读入此部分时,服务器会调用SELECT命令,切换数据库,使得之后读入的键值对可以载入到正确的数据库中

长度:根据数据库号码的不同,可以分为1、2、5字节

  • key_value_pairs

作用:保存了数据库中的所有键值对数据,包括可能存在的过期时间

长度:根据键值对的数量、类型和内容,长度也随之而变

2.3.3 databases#key_value_pairs部分

结构:EXPIRETIME_MS和ms可能没有
在这里插入图片描述

  • TYPE

作用:记录了value的雷系,程序会根据TYPE的值来决定如何读入和解释value的数据,其值可以为如图之一,每个常量都代表了一种对象类型或底层编码:
在这里插入图片描述
长度:1字节

  • key

作用:保存了键值对的键。总是为一个字符串对象,编码方式和REDIS_RDB_TYPE_STRING类型的value一样

长度:根据内容长度的不同,key的长度也会有所不同

  • value

作用:保存了键值对的值

长度:根据TYPE类型、保存内容长度的不同,key的长度也会有所不同

  • EXPIRETIME_MS

作用:过期时间标识符。当读入程序遇到此值,它知道接下来要读入的是一个以毫秒为单位的过期时间

长度:1字节

  • ms

作用:记录一个以毫秒为单位的UNIX时间戳,即该键值对的过期时间

长度:8字节

2.3.4 key_value_pairs#value的编码

不同类型的值对象在RDB文件中的保存结构:

  • 字符串对象

TYPE:REDIS_RDB_TYPE_STRING

编码类型:REDIS_ENCODING_INT、REDIS_ENCODING_RAW

REDIS_ENCODING_INT

保存长度不超过32位的整数:
在这里插入图片描述
ENCODING可以为REDIS_RDB_ENC_INT8、REDIS_RDB_ENC_INT16或REDIS_RDB_ENC_INT32,分别代表使用8、16、32位来保存整数值integer

REDIS_ENCODING_RAW

保存字符串值;
在打开RDB文件压缩功能的情况下(redis.conf的rdbcompression),根据字符串长度的不同,分为压缩和不压缩两种方式来保存:如果小于等于20,则不压缩;如果大于20,则压缩;没打开则直接按无压缩方式保存

例子:
无压缩结构:len为长度、string为内容
在这里插入图片描述
压缩结构:LZF算法、压缩后的长度、原长度、压缩后的字符串;后三个属性用来解压缩
在这里插入图片描述

  • 列表对象

TYPE:REDIS_RDB_TYPE_LIST

编码类型:REDIS_ENCODING_LINKEDLIST

结构:每个项是一个字符串对象
在这里插入图片描述
例子:三个元素及其对应的长度
在这里插入图片描述

  • 集合对象

TYPE:REDIS_RDB_TYPE_SET

编码类型:REDIS_ENCODING_HT

结构:每个项都是一个字符串对象
在这里插入图片描述
例子:四个元素及其对应的长度
在这里插入图片描述

  • 哈希对象

TYPE:REDIS_RDB_TYPE_HASH

编码类型:REDIS_ENCODING_HT

结构:
在这里插入图片描述
例子:两个键值对及其长度
在这里插入图片描述

  • 有序集合对象

TYPE:REDIS_RDB_TYPE_ZSET

编码:REDIS_ENCODING_SKIPLIST

结构:
在这里插入图片描述
例子:两个元素及其长度
在这里插入图片描述

  • INTSET编码的集合

TYPE:REDIS_RDB_TYPE_SET_INTSET

保存对象:整数集合对象

保存方式:先将整数集合转换为字符串对象,再保存到RDB文件里

读入方式:根据TYPE值的提示,先读入字符串对象,再转换成原来的整数集合对象

  • ZIPLIST编码的列表、哈希表、有序集合

TYPE:REDIS_RDB_TYPE_LIST_ZIPLIST、REDIS_RDB_TYPE_HASH_ZIPLIST、REDIS_RDB_TYPE_ZSET_ZIPLIST

保存对象:压缩列表对象

保存方式:
在这里插入图片描述
读入方式:
在这里插入图片描述

2.4 分析RDB文件

使用od命令来分析,该命令可以用给定的格式转存(dump)并打印输入文件

2.4.1 不包含任何键值对的RDB文件

例子:od -c dump.rdb
在这里插入图片描述
依次为"REDIS"字符串、版本号、EOF常量、校验和

2.4.2 包含字符串键的RDB文件

例子:
在这里插入图片描述
依次为"REDIS"字符串、版本号、SELECTDB常量、使用0号数据库、无过期时间的键值对(TYPE、键长度、键、值长度、值)、EOF常量、校验和

2.4.3 包含带有过期时间的字符串键的RDB文件

例子:
在这里插入图片描述
依次是:
在这里插入图片描述

2.4.4 包含一个集合键的RDB文件

例子:
在这里插入图片描述
依次是:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值