Redis的RDB持久化

1:为什么Redis需要持久化?

Redis是内存型数据库,一般被用于缓存,所以Redis需要将数据持久化到硬盘中。

2:RDB持久化的原理是什么?

RDB是采用二进制压缩文件的方式将数据库内容保存到文件中。
数据库在启动的时候会检查是否有RDB文件,然后将其载入数据库。
系统一般有两种方式来创建RDB文件,即阻塞型和非阻塞型,其底层都是调用同一个函数,但是非阻塞型会先派生出一个子进程,然后由子进程执行备份功能。
RDB文件的创建条件是根据在制定时间段内执行的操作次数:通过三个数据结构来实现该功能。首先是struct saveparam数组,该数组是配置参数

struct saveparam{
    time_t seconds;//时间段
    int changes;//修改次数
}

然后通过dirty修改计数器来记录服务器距离上次BGSAVE后对数据库的修改次数。
以及使用time_t lastsave来记录上次BGSAVE的时间点。
通过serverCron守护进程来周期检测是否满足RBD持久化条件

3:RDB文件格式是什么?

这一部分是RDB持久化的重点,首先要知道RDB文件格式:

REDIS|db_version|database|EOF|check_sum
  • REDIS是用来标识RDB文件
  • db_version用来记录RDB文件的版本号
  • database存储数据库信息
  • EOF是用来表示RDB文件的结尾
  • check_sum用于校验,以防止文件被破坏,校验内容为前面全部

对于database部分,又分为:

SELECTDB|db_number|key_value_pairs
  • SELECTDB用于标示即将读入一个数据库号码
  • db_number用于标示数据库号码(Redis可以存储多个数据库)
  • key_value_pairs用于保存数据库的kv值(Redis是键值数据库)
    其中key_value_pairs格式又分为两类:
    如果带有过期时间,则格式为
EXPIRETIME_MS|ms|TYPE|key|value

否则为:

TYPE|key|value

因为Redis的key都是字符串编码,所以TYPE主要用于标示VALUE的编码,具体的编码格式参见:《Redis设计与实现》一书。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容