建议先关注、点赞、收藏后再阅读。
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文件是通过使用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文件中以二进制格式进行存储。
RDB文件的格式如下:
其中,“长度元素”指的是长度信息,用于表示下一个元素的长度,可以是键或者值的长度。而“数据元素”则是实际的键值对数据。
键值对的存储方式为:
其中,“键长度”表示键的长度,“键”表示实际的键值对的键。“值类型”表示值的类型,其值为一个字节,用来标识值的类型,如字符串、列表、哈希表等。“值”表示实际的键值对的值。
具体来说,键长度和值类型这两个元素是固定长度的,长度为5个字节。而键和值则是变长的,长度不固定,根据实际键和值的长度来存储。
举例来说,我们有一个键为"foo",值为字符串"bar"的键值对,它在RDB文件中的存储格式为:
这样就完成了一个键值对的存储。
需要注意的是,在RDB文件中,存储的键值对是按照顺序存储的,每个键值对之间没有分割符号。而且RDB文件还包含了其他的元数据,如Redis版本信息、过期时间等。
RDB文件的结构如下:
RDB文件头部格式:
REDIS+{版本号}
RDB文件包含了多个键值对的数据,每个键值对的结构如下:
[Key类型][Key长度][Key数据][Value数据][过期时间]
其中:
RDB文件的末尾为EOF(End of File)标记。
RDB文件的结构紧凑,具有很高的存储效率,适用于全量数据的备份和恢复。