redis提供了两种持久化方式:RDB、AOF

RDB持久化

RDB文件创建与载入

创建

通过命令save、bgsave生成rdb文件,rdb是一个压缩过的二进制文件,保存数据库状态,可以互相转换。
save命令会阻塞服务器进程,服务器不能处理命令请求。
bgsave命令通过子进程生成rdb文件,父进程继续处理命令。
创建rdb文件的方法是rdbSave

载入

redis载入rdb通过rdbLoad方法
但其实redis在启动时会先判断是否开启aof功能,如果有aof先载入aof文件,因为aof频率高。
redis载入文件流程如图:
redis载入文件流程.png

自动间隔性保存

redis会根据save选项(配置文件或主动命令)满足任意一个条件就会执行bgsave。

save <second> <times>
在多少秒内有多少次数据修改操作

保存

所有设置的配置都由一个数组saveParams保存,数组的元素包含修改次数和时间戳。

通过计数器保存redis修改次数;
通过unix时间戳保存上一次执行save或bgsave的时间。

检查保存条件是否满足

通过redis周期操作函数serverCron 默认每100毫秒执行一次。
执行时遍历saveparams数组,判断保存条件,只要任意一个条件满足,就会执行bgsave命令。

RDB文件结构

rdb文件结构.png

  • REDIS。标识,是否是rdb文件。
  • db_version。rdb文件版本号。
  • database。包含0个或多个数据库,和对应的kv键值对。
  • EOF。标识,标志着rdb文件正文内容结束。
  • check_sum。保存校验和,对前四个列计算出来的,用来检查RDB文件是否正常。

database RDB正文数据

RDB文件解析


AOF持久化

AOF通过保存所有写命令实现。

aof实现

aof实现可分为命令追加(append)、文件写入、文件同步(sync)三部门实现。

命令追加

当执行写命令,redis会将命令以协议格式追加到aof_buf缓冲区末尾。

文件写入与同步

redis服务器的文件事件负责接收客户端命令请求,而时间事件负责像serverCron定时运行时间函数。
redis在每次事件循环结束前会判断是否将aof_buf缓冲区内的数据写入aof文件。写入方法flushAppendOnlyFile
flushAppendOnlyFile的行为由appendfsync选项决定。
appendfsync选项.png

文件的写入和同步:
现代操作系统为提高文件写入效率,调用write函数将数据写入文件时,系统会先将数据保存在内存缓冲区中,当缓冲区空间填满或超过指定时限时,才真正的将缓冲区的数据写入到磁盘里面。
这个方法提高了效率但是也有安全问题,如果计算机停机了,内存的数据也没有了。
所以系统提供了fsyncfdatasync两个同步函数,强制将缓冲区的数据同步到磁盘。

文件载入与数据还原

aof文件载入过程如图:
aof载入过程.png

AOF重写

重写解决aof文件过大问题。
重写:创建一个新的aof文件,去掉冗余数据,保存同样状态的数据。主要命令:bgrewriteaof.

重写原理

不需要对现有aof文件读取、分析、写入操作,而是通过读取当前服务器的数据库状态了来实现。
原理:首先读取键现在的值,然后用一条命令记录键值对,代替之前这个键的多条命令。

标签: none

添加新评论