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设计与实现》一书。
网友评论