前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis中RDB持久化的基本原理和文件格式

Redis中RDB持久化的基本原理和文件格式

原创
作者头像
一凡sir
发布2023-09-21 09:05:00
5350
发布2023-09-21 09:05:00
举报
文章被收录于专栏:技术成长

建议先关注、点赞、收藏后再阅读。

Redis中RDB持久化是一种将数据保存到硬盘上的持久化方式。

它的基本原理如下:

  1. 调用SAVE或BGSAVE: 当Redis需要进行RDB持久化时,可以手动调用SAVE命令或使用BGSAVE命令在后台进行持久化操作。
  2. 创建RDB文件: Redis开始创建一个新的RDB文件,该文件将包含当前数据库中的所有数据。
  3. 写入数据到RDB文件: Redis遍历所有数据库,并将每个键值对写入RDB文件。写入的数据格式为二进制,包含键的字符串长度、键的字符串、键的类型、值的类型、值的长度和值的内容。
  4. 保存RDB文件: 当Redis完成数据写入RDB文件后,将该文件保存到硬盘上的指定位置。
  5. 加载RDB文件: 当Redis启动时,可以通过加载RDB文件恢复先前保存的数据。Redis读取RDB文件,并将数据加载到内存中。

RDB持久化的优点是简单和性能高,因为在进行恢复时只需要加载RDB文件,无需执行其他额外的操作。但是它的缺点是在发生故障时可能会丢失最后一次持久化后的数据,因为RDB文件的更新频率可以设置为不同的值。

Redis中RDB文件的创建和载入过程

Redis中的RDB文件是通过使用fork系统调用创建的。

具体的流程如下:

  1. Redis会定期执行持久化操作,生成RDB文件。持久化操作可以是主动触发的或者是基于配置的自动触发。常见的触发方式有SAVE命令和BGSAVE命令。
  2. 当执行SAVE命令时,Redis将阻塞并开始生成RDB文件。这个过程中,Redis会停止接收新的命令,并将当前的数据集转储到RDB文件中。这可以确保生成的RDB文件是一致的快照。
  3. 当执行BGSAVE命令时,Redis通过fork系统调用创建一个子进程。父进程继续接受新的命令,而子进程则负责生成RDB文件。因为fork系统调用会创建一个与父进程完全相同的子进程,所以在创建子进程时,父进程的内存数据会被复制到子进程中。
  4. 在子进程中,Redis会遍历数据库中的所有键值对,并将其写入RDB文件中。这个过程中,子进程会在读取数据时使用Copy-on-Write(写时复制)技术,以保持数据的一致性。
  5. 当子进程完成写入RDB文件的操作后,它会将RDB文件的路径发送给父进程。
  6. 父进程会将RDB文件的路径信息保存在持久化状态的配置项中,以备将来使用。
  7. 另外,Redis还支持在启动时载入RDB文件。如果存在RDB文件,Redis会在启动时自动执行载入操作。这个过程中,Redis会创建一个新的进程,将RDB文件的数据从磁盘读取到内存中。

Redis中的RDB文件是通过使用fork系统调用创建的,可以通过SAVE命令和BGSAVE命令手动触发生成。生成过程中,Redis会停止接收新的命令,并将当前的数据集转储到RDB文件中。载入RDB文件是在Redis启动时自动执行的,通过创建新的进程将RDB文件的数据从磁盘读取到内存中。

Redis中RDB文件中的键值对存储格式

在Redis中,RDB文件是一种持久化机制,用于将Redis的数据存储到磁盘上。键值对在RDB文件中以二进制格式进行存储。

RDB文件的格式如下:

<长度元素>

<数据元素>

其中,“长度元素”指的是长度信息,用于表示下一个元素的长度,可以是键或者值的长度。而“数据元素”则是实际的键值对数据。

键值对的存储方式为:

<键长度>

<键>

<值类型>

<值>

其中,“键长度”表示键的长度,“键”表示实际的键值对的键。“值类型”表示值的类型,其值为一个字节,用来标识值的类型,如字符串、列表、哈希表等。“值”表示实际的键值对的值。

具体来说,键长度和值类型这两个元素是固定长度的,长度为5个字节。而键和值则是变长的,长度不固定,根据实际键和值的长度来存储。

举例来说,我们有一个键为"foo",值为字符串"bar"的键值对,它在RDB文件中的存储格式为:

键长度(3)

键("foo")

值类型(字符串)

值长度(3)

值("bar")

这样就完成了一个键值对的存储。

需要注意的是,在RDB文件中,存储的键值对是按照顺序存储的,每个键值对之间没有分割符号。而且RDB文件还包含了其他的元数据,如Redis版本信息、过期时间等。

Redis中RDB文件的结构

RDB文件的结构如下:

RDB文件头部格式:

代码语言:txt
复制
REDIS+{版本号}

RDB文件包含了多个键值对的数据,每个键值对的结构如下:

代码语言:txt
复制
[Key类型][Key长度][Key数据][Value数据][过期时间]

其中:

  • Key类型:一个字节的标志位,用于指示Key的类型,如字符串、哈希、列表等。
  • Key长度:一个或多个字节的整数,表示Key的长度。
  • Key数据:Key的字节数组表示。
  • Value数据:Value的字节数组表示。
  • 过期时间:如果该键具有过期时间,则为一个或多个字节的整数,表示以秒为单位的过期时间;否则为0。

RDB文件的结构还包括元数据信息:

  • 保存数据库的数量
  • 数据库的各种属性配置
  • 每个数据库的key-value数据

RDB文件的末尾为EOF(End of File)标记。

RDB文件的结构紧凑,具有很高的存储效率,适用于全量数据的备份和恢复。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 它的基本原理如下:
  • Redis中RDB文件的创建和载入过程
    • 具体的流程如下:
    • Redis中RDB文件中的键值对存储格式
    • Redis中RDB文件的结构
      • RDB文件的结构还包括元数据信息:
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档