我们之前也说了,这个 Redis 是一个内存数据库,如果说有一天我们的机器宕机了,那么我们所有的数据都会消失~~

为了防止这种惨剧发生,所以有了数据持久化。我们将所有的内存数据同步到电脑硬盘上,而这个过程叫数据持久化过程。

一、AOF & RDB

Redis 数据持久化有两种方式,一个是 AOF,一个是 RDB。

AOF

AOF 全称:Append Only File。也就是全持久化模式,这个模式是将 Reids 的操作日志以追加的方式写入文件,这里的操作只包括 写、删 操作,查询不会做记录。

好比我们现在服务器宕机了,从新启动后,redis 会根据这个 AOP 的操作日志,将数据完整还原出来。

RDB

RDB 全称:Redis Database。也就是半持久化模式,这个模式是在指定的时间间隔内将内存中的数据集快照写入磁盘。这里他是相当于做了一次备份。

这两种方式我们可以单独使用一个,也可以两个一起使用,还可以不使用。(默认是使用 RDB 模式)

二、RDB 与 AOF 的优缺点

RDB优势
1. 一旦采用该方式,那么你的整个 Redis 数据库将只包含一个文件,这对于文件备份而言是非常完美的。比如,你可能打算每个小时归档一次最近 24 小时的数据,同时还要每天归档一次最近30天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。
2. 对于灾难恢复而言,RDB是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。
3. 性能最大化。对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行 IO 操作了。
4. 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。
RDB劣势
1. 如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么 RDB 将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。
2. 由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几秒。

AOF优势
1. 该机制可以带来更高的数据安全性,即数据持久性。Redis 中提供了 3 种同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。至于无同步,无需多言,我想大家都能正确的理解它。
2. 由于该机制对日志文件的写入操作采用的是 Append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在 Redis下一次启动之前,我们可以通过 redis-check-aof 工具来帮助我们解决数据一致性的问题。
3. 如果日志过大,Redis 可以自动启用 rewrite 机制。即 Redis 以 Append 模式不断的将修改数据写入到老的磁盘文件中,同时 Redis 还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行 rewrite 切换时可以更好的保证数据安全性。
4. AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,我们也可以通过该文件完成数据的重建。
AOF劣势
1. 对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
2. 根据同步策略的不同,AOF 在运行效率上往往会慢于 RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和 RDB 一样高效。

二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(AOF),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行 save 的时候,再做备份(RDB)。

三、RDB 的使用

进入到我们的 redis 目录,首先来看一下配置文件(redis.conf)

aof分析 redis redis aof过程_rdb

这三个东西是被注释了的,这个是 RDB 的一个配置。

它表示 3600 秒(一个小时)中,有一个 key 被修改就去做持久化;或者 300 秒(5分钟)内有 100 个 key 被修改,也去做持久化;再或者 60 秒(一分钟)内有 10000 个 key 被修改也去做持久化。

aof分析 redis redis aof过程_aof分析 redis_02

然后是这个 dbfilename,这个就是我们持久化后的文件名(这里没有路径!!!单纯的名字而已)

aof分析 redis redis aof过程_rdb_03

这个就是我们上面的文件存储的地方,就在 redis.conf 同级目录中存储。

接下来使用一下这个 RDB

aof分析 redis redis aof过程_rdb_04

首先先去把这个东西打开,然后保存。

aof分析 redis redis aof过程_redis数据持久化_05

然后我们先去本地把之前我们使用的这个 dump.rdb 这个东西删除掉(在此之前,记得先关闭掉 redis ~)

aof分析 redis redis aof过程_aof_06

现在我们开启 redis,并且自己往里面存入一些 key,存入之后,不要直接退出(因为直接退出不会触发 RDB 的持久化),我们使用命令:shutdown save

aof分析 redis redis aof过程_aof_07

这样就有了持久化文件,接着,我们将这个文件移除掉,把它移动到 /home 或者其他地方

aof分析 redis redis aof过程_redis数据持久化_08

现在我们启动 redis,来看看里面还有没有我们刚刚存的 key

aof分析 redis redis aof过程_redis_09

可以看到,毛也没有。我们停掉 redis,将之前的 dump.rdb 移动回来再来启动

aof分析 redis redis aof过程_redis数据持久化_10

aof分析 redis redis aof过程_rdb_11

 

可以看到,我们之前弄得数据回来了。

这一讲就到这里,自己可以去试试看