【后端修行之Redis】RDB持久化

本文用于记录苦啃《Redis设计与实现》后,个人认为有价值的笔记,核心内容均围绕标题展开。既做一个学习的记录,同时也做一个沟通交流,欢迎各位大佬互动~

RDB持久化

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

RDB持久化可以手动执行/服务器配置选项定期执行,把某个时间点的数据库状态保存到RDB文件(一个经过压缩的二进制文件)。

​​​​​​​        

        RDB文件的创建与载入

两个生称RDB文件的命令:SAVE和BGSAVE。

SAVE:阻塞redis服务器进程(期间服务器不能处理任何命令),直到文件创建完毕;

BGSAVE:派生子进程(负责RDB文件创建),服务器进程/父进程继续处理命令请求。

创建工作实际由rdb.c/rdbSave函数完成,SAVE和BGSAVE通过不同方式调用这个函数。

RDB文件载入,是文件在服务器启动时自动执行的(无命令)。

AOF文件比RDB文件更新频率高,因此:

①开启AOF持久化功能,优先使用AOF文件还原数据库状态;

②关闭AOF持久化功能,服务器才会使用RDB文件还原数据库状态。

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

 服务器会被阻塞,直到执行完SAVE命令。

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

BGSAVE执行期间,对SAVE,BGSAVE和BGREWRITEOF三个命令的处理方式和平时有所不同。

对于SAVE命令,会被拒绝。因为避免父进程,子进程同时调用rdbSave;

对于BGSAVE命令,同样被拒绝;

对于BGREWRITEOF命令,如果BGSAVE先执行,会被延迟到BGSAVE执行完毕;BGREWRITEOF命令先执行,BGSAVE就会被拒绝。

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

阻塞状态。

​​​​​​​        自动间隔性保存

通过服务器配置save属性可以让服务器隔一段时间自动执行一次BGSAVE命令。

默认配置:

服务器900秒内,对数据库至少进行1次修改;

服务器300秒内,对数据库至少进行10次修改;

服务器60秒内,对数据库至少进行10000次修改;

​​​​​​​​​​​​​​        ​​​​​​​        设置保存条件

根据配置文件的save属性,设置服务器状态redisServer结构的saveparams属性。

saveparams是一个数组,数组元素是一个saveparam结构:

​​​​​​​​​​​​​​        ​​​​​​​        dirty计数器和lastsave属性

都是维护在服务器状态里的属性:

dirty计数器:上次SAVE/BGSAVE后,服务器对数据库进行了多少次修改(更新、删除、写入);

lastsaveUNIX时间戳:上次成功执行SAVE和BGSAVE命令的时间。

​​​​​​​​​​​​​​        ​​​​​​​        检查保存条件是否满足

redis的服务器周期性函数操作函数serverCron默认每隔100毫秒执行一次(对正在运行的服务器进行维护,其中一项:检查save选项所设置的保存条件是否满足,满足就执行)

​​​​​​​​​​​​​​        RDB文件结构

大写常量,小写变量和数据↓

REDIS表示该文件为RDB文件;

db_version代表RDB文件版本号;

databases包含零个或任意多个数据库(数据库状态为空,则这部分为长度为0字节;非空,则根据保存键值对数量、类型、内容不同,有不同的长度);

EOF长度1字节,标识RDB文件正文内容的结束,读到这个值程序就知道所有键值对载入完毕;

check_sum是8字节长无符号整数,校验和(根据前四部分计算得出)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值