Redis - 面试Redis是如何保证在宕机后数据不丢失的?

发布时间 2023-04-27 15:14:01作者: 李若盛开

原文链接:

https://blog.csdn.net/l688899886/article/details/126575014?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-126575014-blog-124457577.235^v32^pc_relevant_yljh&spm=1001.2101.3001.4242.2&utm_relevant_index=4

 

持久化
首先我们说下什么是持久化,持久化是将程序数据在持久状态和瞬时状态间转换的机制。通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)。另外我们使用的 Redis 之所以快就是因为数据都存储在内存当中,为了保证在服务器出现异常过后还能恢复数据,所以就有了 Redis 的持久化。

RDB 和 AOF
前面说了什么是持久化,现在说说 Redis 的持久化,众所周知 Redis 的持久化有两种方式,一种是快照形式 RDB,另一种是增量文件 AOF。

RDB
RDB 持久化方式是会在一个特定的时间间隔里面保存某个时间点的数据快照,我们拿到这个数据快照过后就可以根据这个快照完整的复制出数据。这种方式我们可以用来备份数据,把快照文件备份起来,传送到其他服务器就可以直接恢复数据。但是这只是某个时间点的全部数据,如果我们想要最新的数据,就只能定期的去生成快照文件。

RDB 的实现主要是通过创建一个子进程来实现 RDB 文件的快照生成,通过子进程来实现备份功能,不会影响主进程的性能。同时上面也提到 RDB 的快照文件是保存一定时间间隔的数据的,这就会导致如果时间间隔过长,服务器出现异常还没来得及生成快照的时候就会丢失这个间隔时间的所有数据;那有同学就会说,我们可以把时间间隔设置的短一点,适当的缩短是可以的,但是如果间隔时间段设置短一点频繁的生成快照对系统还是会有影响的,特别是在数据量大的情况下,高性能的环境下是不允许这种情况出现的。

我们可以在 redis.conf 进行 RDB 的相关配置,配置生成快照的策略,以及日志文件的路径和名称。还有定时备份规则,如下图所示,里面的注释写的很清楚,简单说就是在多少时间以内多少个 key 变化了就会触发快照。如save 300 10 表示在 5 分钟内如果有 10 个 key 发生了变化就会触发生产快照,其他的同理。

除了我们在配置文件中配置自动生成快照文件之外,Redis 本身提供了相关的命令可以让我们手动生成快照文件,分别是 SAVE 和 BGSAVE ,这两个命令功能相同但是方式和效果不一样,SAVE 命令执行完后阻塞服务器进程,阻塞过后服务器就不能处理任何请求,所以在生产上不能用,和SAVE 命令直接阻塞服务器进程的做法不同,BGSAVE 命令是生成一个子进程,通过子进程来创建 RDB 文件,主进程依旧可以处理接受到的命令,从而不会阻塞服务器,在生产上可以使用。

在这里测试一下自动生成快照,我们修改一下快照的生成策略为save 10 2,然后在本地启动Redis 服务,并用 redis-cli 链接进入,依次步骤如下

1、修改配置,如下
2、启动 Redis 服务,我们可以从启动日志中看到,默认是会先读取 RDB 文件进行恢复的
3、链接 Redis 服务,并在 10s 内设置 3 个 key
4、这个时候我们会看到 Redis 的日志里面会输出下面内容,因为触发了规则,所以开启子进程进行数据备份,同时在对应的文件路径下面,我们也看到了 rdb 文件。