目录

一、RDB

1.1 触发机制

1.2 流程说明

1.3 RDB优缺点

二、AOF

2.1 开启AOF

2.2 AOF流程

三、重启加载流程

持久化即备份,这是单机高可用的策略之一,有了备份,就可以在Redis故障通过备份进行恢复。redis持久化主要有RDB和AOF。

RDB

RDB(Redis DataBase),基于策略定时将redis内存中的数据保存到硬盘。需要时可以通过这个备份文件进行恢复。

AOF

AOF(Append Only File),是把每次redis执行的命令记录到日志文件中(类似于MySql的Bin log),当Redis启动时可以通过执行log中的命令来恢复数据

一、RDB

1.1 触发机制

save命令:阻塞当前redis服务器,直到RDB过程完成,服务器在阻塞期间不能处理如何客户端请求,原则上save命令已经废弃。

bgsave命令:会fork一个子进程,RDB的持久化由这个子进程来完成,阻塞只发生在fork阶段,耗时较短,子进程执行rdb期间redis服务器不会阻塞,正常处理客户端请求。

自动触发机制:在redis.conf 配置:

save m n

代表如果在m秒内存在n次的修改时,则执行bgsave命令

1.2 流程说明

aof rdb 文件如何导入redis_子进程

执行bgsave命令,redis父进程判断如果当前存在正在执行的子进程,则直接返回,比如AOF或者RDB子进程。

父进程fork一个子进程,fork过程父进程是阻塞,无法响应客户端请求

fork结束后,bgsave返回“background saving started”信息,并且不再阻塞父进程,父进程可以继续响应客户端请求。

子进程根据父进程的内存快照创建RDB文件,完成后对原有文件进行原子替换。

子进程发送信号给父进程表示RDB完成

1.3 RDB优缺点

优点

RDB是一个压缩的二进制文件,代表Redis在某个时间点上的数据快照,适合备份,全量复制等场景

Redis加载RDB恢复数据远远快于AOF

缺点

RDB无法做到实时持久化

兼容性问题,新版本的redis可能无法兼容老版本的RDB

为了解决实时持久化问题,redis引入了AOF。

二、AOF

2.1 开启AOF

AOF默认是关闭的,通过如下命令开启:

appendonly yes

2.2 AOF流程

aof rdb 文件如何导入redis_aof rdb 文件如何导入redis_02

AOF工作基本流程:

命令写入(append):redis所有的写入命令会追加到aof_buf(缓冲区)中

文件同步(sync):AOF缓冲区根据对应的策略向硬盘做同步操作

文件重写(rewrite):随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的

重启加载(load):redis启动后可以加载AOF文件进行数据恢复。

命令写入

对于每一条redis写入命令,在AOF中会追加一条文本,文本格式是redis文本协议格式(RESP),直接采用协议格式,以来兼容性和可读性高,二来避免了二次处理的开销。

如果直接把命令写入硬盘会影响到redis的性能。先写入aof_buf,然后后期通过同步策略写入硬盘,避免直接的IO影响到redis的性能。

文件同步

redis提供了多种AOF缓冲区文件同步策略,同步策略分别使用了操作系统的wirte函数和fsync函数,说明如下: