Redis RDB文件解析

article/2025/8/29 17:35:57

Redis RDB是什么

Redis rdb是Redis快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据,另外搭建从库或者重建从库也需要拉取主库生成的rdb快照文件。rdb不仅应用于备份恢复和搭建从库,也广泛应用于离线key分析,例如:查找BigKey、HotKey、ColdKye或者Key的访问频率等。

我们可以通过输入info Persistence来查看Redis服务端记录的相关持久化状态的信息。

127.0.0.1:8888> info Persistence
#Persistence
loading:0 															#是否正在保存rdb文件
rdb_changes_since_last_save:356857684 	#最后一次保存rdb文件之后改变的key的个数
rdb_bgsave_in_progress:0 							  #后台是否正在保存rdb文件
rdb_last_save_time:1640573408					 #最后一次保存rdb文件的具体时间
rdb_last_bgsave_status:ok							   #最后一次保存rdb文件的状态,成功或者失败
rdb_last_bgsave_time_sec:0 							#最后一次保存rdb文件消耗的时间
rdb_current_bgsave_time_sec:-1 					#当前保存rdb文件所用的时间,"-1"表示后台没有正在rdb文件
rdb_last_cow_size:1064960 							 #最后一次保存rdb文件的任务消耗的内存
.....

Redis RDB生成的触发条件

其实Redis生成rdb文件有时候是很重的操作,如果使用不当将会造成严重的生产故障。从生成rdb是否阻塞主线程来看,共有两种方式:阻塞式和非阻塞式。阻塞式:使用Redis主线程完成rdb文件的写入;非阻塞式:用Redis主线程fork的子线程完成rdb文件的写入,主线程只需要记录统计状态和指标。那么触发生成rdb文件的条件有哪些呢?请看下图。
![在这里插入图片描述]

(https://img-blog.csdnimg.cn/075c4f3a1dff4f1aadbcb63e2bef8a5a.png)
从上图可以看出有3个常用命令会触发生成rdb文件,并在生成rdb快照的过程中阻塞主线程,命令有:save、flushdb和shutdown,其中shutdown会在真正关机之前查看Redis服务是否开启rdb功能,开启才会阻塞写入rdb文件;非阻塞的方式有bgsave命令、serverCron定时任务及做从库时,做从库从master拉取rdb文件有两种选择,一种是主从落盘复制rdb和主从非落盘复制rdb。无论采用哪种方式最终调用的都是rdbSaveRio函数,rdbSaveRio函数是写rdb文件内容的主函数。

Redis RDB组织结构

Rdb文件是一个紧凑的二进制文件,整体上可分为三个区域:头信息区、数据区、尾信息区。

下图为使用系统命令od输出的Redis6.2.6的rdb文件内容,第一和第三行是用十六进制显示的 dump.rdb 文件的字节内容,这里每两个十六进制数对应了一个字节,而第二和第四行是 od 命令生成的每个字节所对应的 ASCII 字符,由于ASCII 字符只定义了128个字符,所以部分字符是无法识别的,例如0xfa、0xfe、0xc0等。
在这里插入图片描述
注意:rdb文件内容是非常紧凑的,不存在空格、换行的,那么是怎么分割信息呢?其实,在rdb每一部分之前都有一个类型字节,在Redis中称为opcodes,即操作符。

下表为RDB支持的部分操作符

16进制10进制简称说明
0xFF255EOFrdb 文件结束符
0xFE254SELECTDB标识文件中后续键值对所属的数据库编号
0xFD253EXPIRETIMEredis过期时间,使用秒表示。
0xFC252EXPIRETIMEMSredis 过期时间,使用毫秒表示。
0xFB251RESIZEDBredis dbsize,描述 key 数目和设置了过期时间 key 数目
0xFA250AUX辅助字段类型,可以存储任意的的 key-value 对
0xF9249FREQ标识LFU访问频率信息
0xF8248IDLE标识LRU空闲时间

RDB头信息区

RDB 文件头主要是描述信息,如 redis 版本、rdb 创建时间、内存大小等信息的内容,首先是魔数REDIS,后面的00009对应记录了 rdb 文件的版本,到目前为止Redis共有9个版本,各个版本差异说明请参考Redis RDB Version History,后面是redis版本6.2.6以及其他信息。AUX 指令即操作符:0xFA,描述 redis 属性,可存在多个 key-value 组合

RDB数据区

上图中数据区只有一个key,即key1:value1,实际rdb数据区是编码最复杂的区域,采用数十种不同编码方法。0xFE指定数据库编号,示例值 “00” 表示接下来是第 0 个库的数据。0xFB是RESIZEDB 指令,描述总的 key 个数以及有过期时间的 key 个数,总数有1个key,且有过期时间,0xFC 是EXPIRETIMEMS指令,key的过期时间,使用毫秒表示。0xF8是LFU frequency指令,key的访问频率,由于Redis 淘汰策略LRU和LFU共用一个数据结构,58同城线上Redis目前使用的淘汰策略是volatile-lru,所以通过解析rdb文件很容易获得key的访问时间,从而获得key的冷热程度,如果生产中采用scan或者key *等会造成访问时间被污染,从而失去参考意义。

RDB尾信息区

相对于头信息区和数据区,RDB尾信息区简单很多,只有文件描述符0xFF 和8 byte的CRC 64 校验码。

数据区编码详解

Redis rdb数据区内容主要为键值对,下图展示rdb保存key-value的各个元素的操作符和元素的顺序。

在这里插入图片描述

一些key没有过期策略就不会有EXPIERE_TIME元素,在Redis4.0以前rdb文件是不记录LFU和LRU的。另外由于LFU和LRU共用一个数据结构,所以两个功能只能启用一个。VALUE_TYPE为VALUE的类型,前面的xxx是opcodes的编码,具体编码可以参考下图,常见的值类型为:STRING、QUICKLIST、INTSET、SET、ZSET_ZIPLIST、ZSET_2、HASH_ZIPLIST、HASH等。

Redis数据类型/低层编码结构和值类型对应关系
数据类型编码结构值类型
OBJ_SRTRING(0)OBJ_ENCODING_RAW(0)RDB_TYPE_STRING(0)
OBJ_LIST(1)OBJ_ENCODING_QUICKLIST(9)RDB_TYPE_LIST_QUICKLIST(14)
OBJ_SET(2)OBJ_ENCODING_INTSET(6)RDB_TYPE_SET_INTSET(11)
OBJ_SET(2)OBJ_ENCODING_HT(2)RDB_TYPE_SET(2)
OBJ_ZSET(3)OBJ_ENCODING_ZIPLIST(5)RDB_TYPE_ZSET_ZIPLIST(12)
OBJ_ZSET(3)OBJ_ENCODING_SKIPLIST(7)RDB_TYPE_ZSET_2(5)
OBJ_HASH(4)OBJ_ENCODING_ZIPLIST(5)RDB_TYPE_HASH_ZIPLIST(13)
OBJ_HASH(4)OBJ_ENCODING_HT(2)RDB_TYPE_HASH(4)
OBJ_STREAM(6)RDB_TYPE_STREAM_LISTPACKS(15)

上表中这些字符串实际再Redis服务中都是用宏定义的,括号中即为该宏对应的值。

KEY在rdb文件中的保留形式

在Redis中key都可以看作字符串,在rdb文件中它的格式是这样的:

RDB字符串保存形式

在这里插入图片描述

其中LENGTH为了节省空间,采用了变长的格式,具体参考下表:

序号第一个字节第二个字节第三个字节第四个字节第五个字节第六个字节第七个字节第八个字节表示范围占用字节其他说明
100xxxxxx-------<641sting格式
201xxxxxxxxxxxxxx------<2^142sting格式
310000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx---<2^325sting格式
410000001xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<2^568sting格式
511000000xxxxxxxx------[-27,27-1]2int格式
611000001xxxxxxxxxxxxxxxx-----[-215,215-1]3int格式
711000010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx---[-231,231-1]5int格式
811000011LZF格式

另外RDB文件对字符串的保存有两种优化形式,一种是常识将字符串按照整型保存,一种是通过将字符串进行LZF压缩之后保存。

上表序号5-7是将字符串尝试用int保存的具体编码方式,下图为RDB将字符串转换为INT后的保存形式。

RDB字符串按整型保存形式

在这里插入图片描述
上表序号8是将字符串进行压缩保存的具体编码方式,首字节开头的两个bit仍然为11,后六个bit为000011。

RDB LZF保存形式

在这里插入图片描述

COMPRESS_LE表明压缩之后的长度,实际就是DATA的长度,ORIGINAL_LEN这个字段记录的是原始的数据记录长度。

Value在rdb文件中的保留形式

相对key在rdb的保存形式,value类型更多,其中字符串和key的保存相同,不再进行讨论。

1、list的保存

列表在Redis中编码为quicklist结构,从整体看是一个双向链表,但链表的每个节点在Redis中编码为ziplist结构在一块连续的内存中保存,并且保存时可以选择进行LZF压缩或者不压缩。下图为list在rdb中的保存结构。

list未压缩保存形式

在这里插入图片描述

list压缩保存形式

在这里插入图片描述

上图中QUICKLIST是保存的list的元素个数,如果list未压缩,ziplist1保存形式同字符串的保留形式;如果list压缩,LZF1保存形式同RDB LZF保存形式。

2、set的保存

set在Redis中有两种编码方式:一种是intset,一种是Hash。

使用intset的编码方式较为简单,直接使用字符串的方式,Hash的编码方式较为复杂,见下图

list hash保存形式

在这里插入图片描述

上图中字典大小实际记录的是list元素个数,字典键只记录了key,为啥没有value,因为list的元素都是单元素,value都为null,所以没有必要记录。

3、有序集合

zset在Redis中有两种编码方式:一种是ziplist,一种是skiplist。

使用ziplist的编码方式较为简单,直接使用字符串的方式,我重点介绍下skiplist的编码方式,见下图

zset skiplist保存形式

在这里插入图片描述

skiplist长度为zset元素数量,元素已字符串类型保存,元素分值为一个双精度浮点数类型(固定为8个字节)

4、hash类型

hash在Redis中有两种编码方式:一种是ziplist,一种是hash。

使用ziplist的编码方式较为简单,直接使用字符串的方式,我重点介绍下hash的编码方式,见下图

在这里插入图片描述

hash长度实际为hash的元素个数,键和值都是字符串的方式保存

总结

从以上的各类型保存形式可以发现,虽然数据类型很多,但是底层元素保存都遵循简单的字符串保留方式,所以重点总结了KEY在rdb文件中的保留形式

通过以上的介绍,希望大家能对RDB文件有个简单的了解,并最终指导开发RDB解析程序,为开发提供更加丰富的离线key分析产品。

相关链接:

从源码角度解析如何生成和解读RDB文件

redis rdb 文件格式详解

RDB分析源码

redis-rdb-tools地址


http://chatgpt.dhexx.cn/article/OyfPZLaW.shtml

相关文章

RDB 持久化详解

文章目录 持久化的执行SAVE&#xff1a;阻塞服务器并创建RDB文件BGSAVE&#xff1a;以非阻塞方式创建RDB文件通过配置文件自动创建RDB文件查看最近持久化时间 RDB优化配置1. save2. stop-write-on-bgsave-error3. rdbcompression4. rdbchecksum5. sanitize-dump-payload6. dbfi…

RDB持久化

RDB持久化 一、RDB快照实现二、快照用法三、执行快照时的数据修改四、RDB 和 AOF 合体 一、RDB快照实现 Redis 是内存数据库&#xff0c;但是它为数据的持久化提供了两个技术。 分别是「 AOF 日志和 RDB 快照」。 这两种技术都会用各用一个日志文件来记录信息&#xff0c;但…

RDB底层原理

Redis服务器自动保存功能的实现原理及文件中的各个组成部分 因为Redis是内存数据库&#xff0c;它将自己的数据库状态储存在内存里 面&#xff0c;所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面&#xff0c; 那么一旦服务器进程退出&#xff0c;服务器中的数据库…

Redis持久化原理(RDB)

在上一篇文章中&#xff0c;介绍了Redis的内存模型很重要&#xff0c;从这篇文章开始&#xff0c;将依次介绍Redis高可用相关的知识——持久化、复制(及读写分离)、哨兵、以及集群。 本文将先说明上述几种技术分别解决了Redis高可用的什么问题&#xff1b;然后详细介绍Redis的…

运行程序时出现 应用程序无法启动,因为应用程序的并行配置不正确

最近发布给客户的程序中&#xff0c;双击exe程序出现“应用程序无法启动&#xff0c;因为应用程序的并行配置不正确”&#xff0c;下面提示使用sxstrace跟踪调试应用程序运行时需要的动态库的版本和路径。 于是有以下操作&#xff1a; 步骤&#xff1a; 1.利用管理员身份运行命…

谷歌浏览器出现应用程序无法启动,因为应用程序的并行配置不正确....(亲测完美解决)

电脑开机 完整报错提示为&#xff1a; 应用程序无法启动&#xff0c;因为应用程序的并行配置不正确。有关详细信息&#xff0c;请参阅应用程序事件日志&#xff0c;或使用命令行 sxstrace.exe 工具。 刚开始也在网上找了N久的解决方案&#xff08;如&#xff1a;启动windws Mod…

成功解决“tesseral应用程序无法打开,因为运行程序并行配置不正确”

目前网上流传的两种方法1是启动Windows Modules Installer并重启 但我的并没有处于禁用状态。 第二种是查看日志安装对应库&#xff0c;比较麻烦。 无意中发现第三种方式&#xff0c;操作更为简单。 我的tesseral版本是7.0.6&#xff0c;初次打开会提示如题报错&#xff0c;…

chrome 应用程序无法启动,因为应用程序的并行配置不正确

方法一&#xff1a; 开始 - 运行&#xff08;输入services.msc&#xff09;- 确定或回车&#xff0c;打开&#xff1a;服务&#xff08;本地&#xff09;&#xff1b; 我们在服务&#xff08;本地&#xff09;窗口找到&#xff1a;Windows Modules Installer服务&#…

exe应用程序无法启动,因为应用程序的并行配置不正确

问题&#xff1a;exe应用程序无法启动&#xff0c;因为应用程序的并行配置不正确。有关详细信息&#xff0c;请参阅应用程序事件日志&#xff0c;或使用命令行 sxstrace.exe 工具。 原因查找&#xff1a; 1&#xff09;开始→所有程序→附件→右键命令提示符→以管理员身份运…

STM32CubeMx开发之路—在线升级OTA

文章目录 运行环境简介基础知识(1/4)STM32中的程序在哪儿?进行分区总体流程图 BootLoader程序流程图分析程序编写和分析 App程序流程图分析程序编写和分析Ymodem协议代码分析 结果验证代码的下载BootLoader的下载App1的下载生成App2的.bin文件使用Xshell进行文件传输 总结源代…

基于FPGA的在线升级

基于FPGA的在线升级 在线升级的意义在线升级的策略整体框架总结参考文献结束语 在线升级的意义 首先什么是FPGA的在线升级&#xff1f; 所谓FPGA的在线升级其实就是不对FPGA进行常规意义下的下载程序&#xff0c;便可以通过一些手段更新FPGA中的程序&#xff0c;一般用到的工具…

MCU通过UART实现OTA在线升级流程

关注星标公众号&#xff0c;不错过精彩内容 素材来源 | 网络 OTA升级已经不是什么新鲜事&#xff0c;现在大多数物联网终端设备&#xff0c;基本具备这个功能。 今天以AT32为例给大家分享一下OTA升级的详细流程。 概述 空中下载技术OTA&#xff08;Over-the-Air Technology&…

Qt 在线升级功能

开源QSimpleUpdater是一个Qt在线升级模块 &#xff0c;但是QSimpleUpdater 由于使用了很久以前的版本&#xff0c;并且近几年没有维护&#xff0c;因此其内部好多Qt的widget文件&#xff0c;这些QWidget与项目的整体风格不符合&#xff0c;说白了就是很丑&#xff0c;现在用QML…

stm32-IAP(在线升级程序)

第一章 背景知识 什么是IAP&#xff1f; IAP的知识网上的各种资料也说的比较明白&#xff0c;在此简单介绍一下。IAP&#xff08; In Application Programming&#xff09;即在线应用编程&#xff0c;也就是用户可以使用自己的程序对单片机的User Flash的某一区域&#xff08…

【Android】轻松实现 APK 在线升级

【Android】轻松实现 APK 在线升级 APK 在线升级 APK 在线升级几乎是所有程序必备的功能。 在线升级功能能解决已有的问题并提供更丰富的新功能。 基本的流程是&#xff1a; 检测到新版本信息弹出升级提示窗口点击 No 不进行升级&#xff0c;完毕&#xff01;点击 Yes 后台…

车载Linux固件升级,一种车载系统固件在线升级方法与流程

本发明涉及汽车系统升级技术领域,尤其涉及一种车载系统固件在线升级方法。 背景技术: 随着汽车智能化、网联化的发展趋势,车联网的技术进步带来汽车软件系统的复杂度不断增加,升级迭代的速度越来越快,软件的不稳定性风险不可避免。统计数据显示,当前市场一半以上的汽车召…

51单片机IAP在线升级

51单片机IAP在线升级 爱矽半导体E85F3325单片机IAP在线升级教程&#xff0c;此处可查看更新及demo下载 文章目录 前言一、ROM资源二、KEIL有关知识1.BL51连接器&#xff1a;2.LX51连接器&#xff1a; 三、Keil其他相关项说明&#xff1a;四、MCU启动文件说明&#xff1a;五、例…

在线升级版本:ESXI6.5升级7.0

将一台使用ESXI6.7的虚升级条件 1、首先确保硬件是否能升级到7.0版本&#xff0c;注意&#xff1a;物理网卡驱动为e1000e不能升级&#xff0c;如果是igbn&#xff0c;则可以顺利升级。拟机升级到了7.0版本。 升级方法 升级方法有补丁升级、在线升级和U盘升级三种方式&#xff0…

Ubuntu 如何 在线升级系统

Ubuntu 如何升级更新系统 有也常用 Kali Linux 的小伙伴会很熟悉&#xff0c;在Kali中我们只需要使用apt/apt-get包管理器执行如下命令即可&#xff1a; sudo apt update && apt upgrade -y一般执行结束就已完成Kali系统的更新或者再加上: sudo apt dist-upgrade -y&am…

跨平台应用开发进阶(三): uni-app 实现资源在线升级/热更新

文章目录 一、前言1.1 Android升级检测机制 二、wgt 资源升级包升级2.1 修改版本号2.2 发行2.3 安装资源升级包2.3.1 代码示例2.3.2 小结 三、整包升级3.1 客户端实现3.2 数据表实现3.3 服务端实现3.4 发版配置3.5 注意事项 四、Uni-app 版本升级中心4.1 升级中心 uni-upgrade-…