版权声明:Author:我爱双面奶 https://blog.csdn.net/qq_34092585/article/details/82153360
两个用于生成RDB文件的命令
- save:会阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞期间,服务器不能处理任何命令请求
- bgsave:会派生出一个子进程,然后由子进程负责创建RDB文件,服务器经常(父进程)可以继续处理请求
save、bgsave命令本质都是调用rdb.c/rdbSave函数完成RDB文件的创建,只是内部逻辑不一样。
RDB文件载入
RDB文件会在服务器启动时自动完成载入。
由于AOF文件的更新频率通常比RDB文件的更新频率高所以:
- 如果服务器开启了AOF持久化功能,服务器优先使用AOF文件来还原数据库
- 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库
bgsave命令执行时服务器状态
服务端在bgsave命令执行期间:
- 其他客户端发送的save命令会被拒绝,因为同时执行两个rdbSave函数会产生竞争。
- 其他客户端发送的bgsave命令会被拒绝,因为同时执行两个rdbSave函数会产生竞争。
- 其他客户端执行bgrewriteaof,bgrewriteaof命令会被延迟到bgsage命令之后执行【如果bgrewriteaof命令正在执行,客户端发送的bgsave命令会被拒绝】
redisServer关于RDB的数据结构
/**
*Redis 服务器类
*/
struct redisServer{
...
//记录了保存条件的数据
struct saveparam *saveparams;
//修改计数器
long long dirty;
//上一次执行保存的时间
time_t lastsave;
...
}
/**
*save 选项设置的保存条件
*/
struct saveparam {
//秒数
time_t seconds;
//修改数
int changes;
}
- saveparams属性:该属性是一个数组,数组中每个元素是一个saveparam结构,每个结构中保存了一个save选项设置的保存条件
- dirty属性:记录距离上一次成功rdbSave之后,服务队数据库状态进行修改的次数,再下一次rdbSave时会被重置为0
- lastsave属性:记录服务器上次成功执行rdbSave的时间
RDB文件结构
- REDIS:5字节,保存"REDIS"五个字符,通过这一部分,程序在载入RDB文件是可以快速检查该文件是否为RDB文件。
- db_version:4字节,保存RDB文件的版本号,和redis版本有关
- databases:长度视情况而定,包含0个或多个数据库,已经数据库中的键值对数据
- EOF:1字节,标志着RDB文件正文内容结束
- check_sum:8字节,保存着由程序通过REDIS、db_version、databases、EOF四部分内容进行计算得出的校验和,在载入RDB文件时会重新计算校验和与该字段进行对比,以此来判断RDB文件是否出错或者损坏
databases文件结构
- SELECTDB属性:1字节,标志着接下来要读入的将是一个数据库号码
- db_number属性:1字节、2字节或5字节,保存着一个数据库号码【当程序读取到该属性后会调用select命令,根据读入的数据库号码进行数据库切换】
- key_value_pairs属性:长度视情况而定,保存了该数据库中所有的键值对数据
key_value_pairs文件结构
不带过期时间:
- TYPE属性:value对象的encoding属性即编码类型
- key属性:保存键值对的键
- value属性:保存键值对的值
带过期时间:
- EXPIRETIME_MS属性:1字节,标志着接下来要读入的将是一个过期时间
- ms属性:8字节,保存过期时间
- TYPE属性:value对象的encoding属性即编码类型
- key属性:保存键值对的键
- value属性:保存键值对的值