【Redis】理论进阶篇------Redis的持久化

时间:2024-02-20 20:18:44

一、前言

     前面学习了Redis的相关的十大数据类型以及用SpringBoot集成我们的Redis的工具代码的书写。从这篇文章开始,就会从Redis相关的一些理论(也是面试和工作的热点知识)如:Redis的持久化、Redis的订阅发布模型、Redis集群环境搭建、哨兵模式等等方面介绍Redis相关的进阶知识。希望对各位小伙伴能有所帮助。

二、Redis的持久化

1、为什么会有Redis的持久化

首先Redis是我们的缓存,是一种内存数据库,如果我们存储数据的时候,不将数据库状态储存到磁盘中,那么服务器一旦宕机、进程出现错误。服务器中的数据也会随之消失。所以为Redis提供持久化的功能是必不可少的!

2、Redis的持久化是什么

官网原话:

上面是官方对Redis持久化做出的解释,我们不难看出Redis的持久化就是将数据写入磁盘。而其中的关键操作其实是RDB与AOF。接下来会其详细展开介绍。

3、RDB

1、什么是RDB

Redis Database用官网的话说就是:在指定的时间间隔内将内存中数据集快照(Snapshot  像照相机那样咔嚓一下)写入磁盘,如果要恢复数据集则将快照文件读取到内存中。

工作流程:redis中会有一个父进程,正常的处理client发出的各种请求,此时如果要触发RDB生成RDB文件,则可以通过配置文件修改触发的操作我们称为自动触发、或则通过save和bgsave指令来手动触发来实现数据备份。此时父进程就会产生(fork)一个子进程来实现持久化,会先将数据写入一个临时文件中,待持久化结束后,再用这个临时文件代替上次持久化好的文件(rdb保存的文件就是一个dump.rdb文件)。整个过程主进程不进行 任何IO操作,确保了极高的性能。

2、RDB的触发

①RDB的自动触发

首先我们找到我们Redis下载的文件目录,我们找到以.conf结束的文件:

打开这个文件找到我们的快照Snapshot 

正如Redis的配置文件所示 save <seconds> <changes>,当我们的时间间隔大于等于设置的seconds,修改次数大于等于changes时,Redis会自动触发RDB,生成对应的dump.rdb文件。

②RDB的手动触发

既然有自动触发,为什么需要手动触发呢。因为自动触发是规定操作内生成dump.rdb文件,但是如果有非常重要的数据需要及时存储,但是又不满足自动触发的需求。这时Redis官方,就为我们提供了save和bgsave两种手动触发的操作来 生成RDB文件。

a.save指令

用户可以通过执行SAVE命令,要求Redis服务器以同步方式创建出一个记录了服务器当前所有数据库数据的RDB文件。而且再持久化完成save指令的整个期间内,Redis都不能处理 其他的命令。SAVE命令是一个无参数命令,它在创建RDB文件成功时将返回OK作为结果。(注:线上禁止使用,不推荐)

b.bgsave

Redis会在后台异步进行拍照操作,不阻塞快照同时还可以响应客户端的请求,该持久化化会fork一个子进程,由子进程复制持久化的过程(父进程与子进程各做各的,会不干扰)。

③总结rdb文件的触发

1:通过我们的各种触发操作,会自动触发rdb规则;

2:除了以上,执行flushdb/flushall命令,也会触发rdb规则(为了保证数据的完整性,但是文件里面是空白的);

3:退出redis,也会产生rdb文件。

4:主从复制时,主节点自动触发。

3、RDB的恢复

从以下方面恢复数据

①:只需将rdb文件放在我们Redis的启动目录下,redis启动时候会自动检查dump.rdb文件恢复其数据;

②:物理恢复,一定服务和备份分机隔离。(PS:不可以把备份dump.rdb文件和产生redis的服务器放在同一台机器,必须分开存储,以防生产机物理损坏后备份文件也挂了)

4、AOF

1、什么是AOF

Append Only File用通俗的话来讲:以日志的形式来记录每个写操作,将Redis执行的所以写操作指令记录下来(读操作不记录)。当重启Redis的时候会将新的持久化的日志文件中的数据恢复。

Redis中AOF的操作流程:

①:Client作为命令的操作者,会在redis中不断书写各种指令命令;

②:Redis并不会直接将这些指令命令直接写入AOF文件,而是先写在一个临时的AOF文件中(其实是一个缓冲区)。当这个临时文件的数量足够多时,再写入磁盘,避免了频繁的IO操作;

③:AOF的临时文件会根据三种写回策略(后面解释)将命令写入磁盘上的AOF文件中;

④:当AOF文件中的内容越来越多时,会执行AOF重写,起到AOF文件压缩的目的。

⑤:当Redis重启的时候会将AOF中的数据重新载入。

2、AOF中的常见配置指令

我们像RDB一样,找到AOF的配置文件,介绍相关指令:

1:appendonly no 

默认不开启,我们需要手动进行配置,将"no"->"yes"

2:appendfilename "appendonly.aof"

表示修改的生成的aof文件的名称

3:三种回写策略机制

appendfsync always:同步回写,优:可靠性高,数据基本不丢失;缺:是一个极端,每个命令都要写到磁盘,性能影响大。
appendfsync everysec:每秒回写,优:性能适中;缺:宕机时,丢失一秒类数据。(Redis默认)
appendfsync no:OS控制的回写,优:新能好;缺:也是一个极端,宕机时,丢失数据数据较多。

4:AOF文件重写规则

首先aof默认文件无限追加,这样文件就会越来越大。

同时满足以下的关系,才会触发AOF的重写:

auto-aof-rewrite-percentage 100:根据上次重写后的aof大小,判断当前aof是不是增长了一倍
auto-aof-rewrite-min-size 64mb:如果aof文件大于64M,fork一个子进程来将我们文件进行重写

三、RDB与AOF的各自优缺点

1、RDB

优:

①:适合大规模的数据恢复

②:可以按照业务定时备份

③:对数据完整性和一致性要求不高

④:RDB文件在内存中加载速度比AOF快的多

缺:

①:在一定时间内做一次备份,如果redis出现宕机的话,就会丢失从当前开始的最近一次快照期间的数据

②:内存数据的全量同步,数据量太大,会大量使用IO,影响服务器性能

③:fork子进程的时候,会占用一定空间,需要考虑内存空间的问题

2、AOF

优:

①更好的保护数据不丢失、性能高、可做紧急恢复

缺:

①:在相同数据集下,aof文件要远大于rdb文件,恢复速度慢 

②:aof的效率慢于rdb,所以redis默认的是使用rdb持久化

四、RDB和AOF的混合使用

1、谁的优先级大

我们知道Redis默认使用的是RDB,那么如果将aof与 rdb同时开启,是不是rdb的优先级就更大,先加载RDB文件呢?我们先来看个流程图:

从该图中我们可以看出,如果有aof文件,则先加载aof文件;若没有aof文件而开启了rdb则先加载rdb文件,如果两个都没开启,则该怎么执行就怎么执行。

2、开启RDB与AOF的混合模式

①:开启混合方式

aof-use-rdb-preamble yes(默认是yes)

②:开启结果

PS:前提是开启AOF。

RDB做全量的持久化,AOF做增量的持久化:即先使用RDB进行快照的储存,然后使用AOF持久化做所有写的操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。

总的来说最后生成的也是aof文件,但是该文件一部分包含了RDB格式,一部分包含了AOF格式。

如下所示:

五、总结

最后做一个总结,首先博主的这篇博客的记录是学习了b站上up主【狂神说JAVA】、【尚硅谷】的redis学习视频后写的。然后这篇博客也是在以前Redis版本上的基础上结合最新的版本完成的。当然博主自己写的这篇博客也是让我自己对Redis的持久化功能有了更进一步的认识,我个人觉得这篇博客对一些常见的关于Redis的持久化的面试题的回答是涉及的足够的。如果对正在阅读的小伙伴有帮助,不要忘记点赞????哦。