【Redis】RDB持久化

本文详细介绍了Redis的RDB持久化机制,包括RDB文件的创建与载入过程、SAVE与BGSAVE命令的工作原理、自动保存条件及RDB文件结构等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

RDB持久化

RDB文件的创建与载入

SAVE命令执行时的服务器状态

BGSAVE命令执行时的服务器状态

RDB文件载入时的服务器状态

自动间隔性保存

设置保存条件

Dirty计数器和lastsave属性

检查保存条件是否满足

RDB文件结构

databases部分

key_calue_pairs部分

value编码


RDB持久化

服务器中的非空数据库以及它们的键值对统称为数据库状态。

  因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以一旦服务器进程退出,服务器中的数据库状态也会消失不见。

  为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。因此RDB文件是保存在硬盘里面的

RDB文件的创建与载入

SAVE和BGSAVE可以用于生成RDB文件。

SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求

BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程继续处理命令请求

RDB文件载入工作是在服务器启动时自动执行的,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入RDB文件。

  1. 如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。
  2. 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。

SAVE命令执行时的服务器状态

阻塞

BGSAVE命令执行时的服务器状态

BGSAVE命令执行期间,客户端发送的SAVE命令会被服务器拒绝,服务器禁止SAVE命令和BGSAVE命令同时执行是为了避免父进程(服务器进程)和子进程同时执行两个rdbSave调用,防止产生竞争条件。

在BGSAVE命令执行期间,客户端发送的BGSAVE命令会被服务器拒绝,因为同时执行两个BGSAVE命令也会产生竞争条件

BGSAVE和BGREWRITEAOF两个命令不能同时执行:

  1. 如果BGSAVE命令正在执行,那么客户端发送的BGREWRITEAOF命令会被延迟到BGSAVE命令执行完毕之后执行
  2. 如果BGREWRITEAOF命令正在执行,那么客户端发送的BGSAV命令会被服务器拒绝

RDB文件载入时的服务器状态

服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。

自动间隔性保存

满足以下三个条件中任意一个,BGSAVE命令就会自动被执行

  1. 服务器在15min内,对数据库进行了至少1次修改
  2. 服务器在5min内,对服务器进行了至少10次修改
  3. 服务器在1min内,对服务器进行了至少1000次修改

设置保存条件

 

 

Dirty计数器和lastsave属性

 

检查保存条件是否满足

Redis的服务器周期性操作函数serverCron默认每隔100ms就会执行一次,该函数用于对正在运行的服务器进行维护,其中一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足,就会执行BGSAVE

RDB文件结构

 

REDIS:五字节,保存着“REDIS”五个字符,用于检查是否为RDB文件

db_version:4字节,RDB文件版本号

databases:包含着零个或任意多个数据库,以及数据库中的键值对数据

EOF:1字节,标志RDB文件正文内容结束

check_sum:8字节无符号整数,保存校验和,校验和是前四个部分的内容进行计算得出的。通过在载入数据计算所得出的检验和与check_sum进行对比,以此来检查RDB文件是否出错或者损坏的情况出现。

databases部分

 

SELECTDB:1字节

db_number:数据库号码。1、2或、5字节

key_calue_pairs:保存数据库中所有键值对数据,如果有过期时间,过期时间也会和键值对保存在一起

key_calue_pairs部分

 

 

value编码

  1. 字符串对象

 

 

 

  1. 列表对象

 

 

  1. 集合对象

 

 

  1. 哈希表对象

 

 

  1. 有序集合对象

 

 

  1. INSET编码的集合

先将整数集合转换为字符串对象,然后将这个字符串对象保存到RDB文件里面

  1. ZIPLIST编码的列表、哈希表或者有序集合
  1. 将压缩列表转换成一个字符串对象
  2. 将转换所得的字符串对象保存到RDB文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值