Redis持久化之RDB文件

Redis的RDB持久化通过创建快照来保存数据库状态,防止数据丢失。RDB文件由SAVE和BGSAVE命令生成,其中BGSAVE在后台执行,不影响正常服务。自动创建RDB的条件是满足特定时间内的数据修改次数。RDB文件包含文件头、数据库、键值对等信息,不同数据类型在文件中有特定表示。服务器启动时自动载入RDB文件恢复数据。此外,AOF持久化若开启,优先于RDB用于数据恢复。
摘要由CSDN通过智能技术生成

我们知道,Redis之所以查询速度快,是因为其是一个基于内存的数据库,但是如果不将数据记录到磁盘上,当服务器出现故障或关机重启后,就会出现数据丢失的情况,这显然不是我们想要的,为了解决这个问题Redis提供了RDB持久化功能来避免数据的丢失。
RDB是一个经过压缩的二进制文件,Redis通过手动或者自动执行,可以生成相对应的RDB文件,同时在进行数据还原时,可以通过解析RDB文件来还原数据库的状态。

一、RDB文件怎么创建以及何时创建

1.1 怎么创建

Redis提供了两个命令来实现RDB文件的生成,分别是SAVE和BGSAVE
其中SAVE命令为阻塞Redis服务器正常的进程,直到RDB文件创建结束为止,在此期间,Redis服务器不会处理任何请求,此时客户端发送的所有请求都会阻塞,知道服务器开始处理请求;
而BGSAVE命令则会fork出一个子进程去创建RDB文件,父进程继续处理请求,不会影响Redis服务器处理正常的请求,但此时服务器会拒绝客户端发送的SAVE和BGSAVE请求,避免重复执行生成和资源竞争。

1.2何时创建

RDB文件的创建分为手动执行和自动执行,其中手动执行则是通过手动执行上文中的SAVE和BGSAVE命令来实现,此处主要介绍自动执行:
所谓自动执行,必须要满足两个要素,执行条件和执行时机

  1. 执行条件
    Redis服务在启动时,会从redis.conf读取配置的生成RDB文件的执行条件,默认配置如下:
    save 900 1
    save 300 10
    save 60 10000
    即900秒内至少一次修改,300秒内至少10次修改,60秒内至少10000次修改,当满足这三个条件中的任意一个时,就会触发生成RDB文件,当然用户也可以根据实际业务场景,通过修改配置文件来设置合理的执行条件
  2. 执行时机
    当我们满足执行条件时,什么时候或者什么东西帮我们去完成RDB文件的创建呢?这里就要引入Redis的事件;

Redis中存在两种事件:
1、文件事件:服务器与客户端之间的通信会产生相应的文件,而服务器通过监听并处理这些文件来完成一系列网络之间的通信操作;
2、时间事件:Redis中的一些操作需要给定时间点去执行,时间事件就是对这类需要定时执行操作的抽象,主要分为定时执行和周期执行。

此处就是使用Redis时间事件中的serverCron函数来定时进行配置文件判断,并执行BGSAVE命令,进而生成RDB文件,服务器默认serverCron每秒执行10次,用户也可以通过配置redis.conf 文件来修改执行次数。

二、RDB文件结构

2.1 文件基本结构

一个完整的RDB文件结构如下:
在这里插入图片描述
其中:
1、第一层代表RDB文件的整体架构,包括开头字符串“REDIS”,RDB文件版本db_version,零个或多个数据库database,RDB文件结束字符EOF,8字节长的无符号整数校验和check_num
下图是新安装的redis,手动保存的RDB文件:
在这里插入图片描述
从图中,我们可以看出来,初始化时RDB文件除了我们说道的几个属性,还包括redis版本号、redis-bits\、ctime和内存使用used-mem以及aof-preamble等信息;
2、第二层代表零个或多个数据库;
3、第三层给出来每个数据库在RDB文件中的存储结构,包括SELECTED,数据库编号db_number,以及键值对对象key_value_pairs
4、第四层代表每个键值对在RDB文件的存储结构,分为不带过期时间和带过期时间。

2.2 存放各基础类型的RDB文件结构

2.2.1 字符串

为Redis新增一个字符串值,并生成RDB文件,解析文件如下图,会发现在RDB文件中出现了我们新增加的值:
新增字符串值
解析仅有字符串的RDB文件
解析RDB文件,我们会发现,当value值为字符串时,RDB文件存放的就是字符串,但是value值为数字时,RDB中存放的是该数字的八进制格式;

2.2.2 列表

为Redis新增一个列表list值,并生成RDB文件,解析文件如下图,发现在RDB文件中出现了我们新增加的值,每个值前面都会有一个代表值长度的数字:

新增list值
解析仅有list的RDB文件

2.2.3 集合

为Redis新增集合值,并生成RDB文件,解析文件如下图,发现在RDB文件中出现了我们新增加的值,每个值前面都会有一个代表值长度的数字:
在这里插入图片描述
在这里插入图片描述

2.2.4 哈希表

为Redis新增哈希表值,并生成RDB文件,解析文件如下图:
在这里插入图片描述
在这里插入图片描述

2.2.5 有序集合

为Redis新增有序集合值,并生成RDB文件,解析文件如下图:
在这里插入图片描述
在这里插入图片描述

三、RDB文件何时载入

上文中,我们了解了RDB文件的创建方法、创建条件以及RDB文件的基本结构,但是生成的RDB文件什么时候使用呢?
其实RDB文件的载入,实在服务器启动时自动执行的,所以并没有相应的手动执行的命令,只要Redis服务器在启动时,检测到RDB文件的存在,就会自动载入RDB文件。

除了RDB持久化,Redis还提供了AOF持久化方法,并且AOF文件的更新频率通常比RDB文件的更新频率高,所以:
如果服务器开启了AOF持久化功能,服务区会优先使用AOF文件来还原数据库状态;
只有当 AOF持久化关闭时,服务器才会使用RDB文件来恢复数据库状态。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值