(五)、Redis的RDB持久化---Redis设计与实现读书笔记

版权声明: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文件的更新频率高所以:

  1. 如果服务器开启了AOF持久化功能,服务器优先使用AOF文件来还原数据库
  2. 只有在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文件结构

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属性:保存键值对的值

猜你喜欢

转载自blog.csdn.net/qq_34092585/article/details/82153360