建议先关注、点赞、收藏后再阅读。
Redis中RDB持久化是一种将数据保存到硬盘上的持久化方式。
它的基本原理如下:
- 调用SAVE或BGSAVE: 当Redis需要进行RDB持久化时,可以手动调用SAVE命令或使用BGSAVE命令在后台进行持久化操作。
- 创建RDB文件: Redis开始创建一个新的RDB文件,该文件将包含当前数据库中的所有数据。
- 写入数据到RDB文件: Redis遍历所有数据库,并将每个键值对写入RDB文件。写入的数据格式为二进制,包含键的字符串长度、键的字符串、键的类型、值的类型、值的长度和值的内容。
- 保存RDB文件: 当Redis完成数据写入RDB文件后,将该文件保存到硬盘上的指定位置。
- 加载RDB文件: 当Redis启动时,可以通过加载RDB文件恢复先前保存的数据。Redis读取RDB文件,并将数据加载到内存中。
RDB持久化的优点是简单和性能高,因为在进行恢复时只需要加载RDB文件,无需执行其他额外的操作。但是它的缺点是在发生故障时可能会丢失最后一次持久化后的数据,因为RDB文件的更新频率可以设置为不同的值。
Redis中RDB文件的创建和载入过程
Redis中的RDB文件是通过使用fork系统调用创建的。
具体的流程如下:
- Redis会定期执行持久化操作,生成RDB文件。持久化操作可以是主动触发的或者是基于配置的自动触发。常见的触发方式有SAVE命令和BGSAVE命令。
- 当执行SAVE命令时,Redis将阻塞并开始生成RDB文件。这个过程中,Redis会停止接收新的命令,并将当前的数据集转储到RDB文件中。这可以确保生成的RDB文件是一致的快照。
- 当执行BGSAVE命令时,Redis通过fork系统调用创建一个子进程。父进程继续接受新的命令,而子进程则负责生成RDB文件。因为fork系统调用会创建一个与父进程完全相同的子进程,所以在创建子进程时,父进程的内存数据会被复制到子进程中。
- 在子进程中,Redis会遍历数据库中的所有键值对,并将其写入RDB文件中。这个过程中,子进程会在读取数据时使用Copy-on-Write(写时复制)技术,以保持数据的一致性。
- 当子进程完成写入RDB文件的操作后,它会将RDB文件的路径发送给父进程。
- 父进程会将RDB文件的路径信息保存在持久化状态的配置项中,以备将来使用。
- 另外,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文件的结构紧凑,具有很高的存储效率,适用于全量数据的备份和恢复。