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

2023-09-21 09:05:00 浏览数 (1)

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

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文件的结构紧凑,具有很高的存储效率,适用于全量数据的备份和恢复。

0 人点赞