Redis的RDB和AOP持久化及配置

Redis介绍

Redis是一个内存型的NoSql非关系型数据库,它将所有的数据存储在内存中进行读写操作,这也是Redis为什么非常快的原因之一。但是当Redis服务重启、电脑重启、电脑宕机等原因,Redis在内存中存储的数据就会丢失(不可找回),内存虽然快但是重启之后内存中的数据就被清楚了。所以Redis就提供了两种持久化(将数据存储到磁盘上)方案,分别是RDBAOF,目的都是在重启Redis服务时根据磁盘文件将数据恢复到内存中,继续提供数据服务,各位童鞋也可以参照:Redis持久化官方文档

RDB

介绍

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

配置

在Redis的redis.conf配置文件中RDB是默认开启的。

# 配置持久化文件存储路径
dir "/var/redis-5.0.5/data"
# 配置rdb
# 20s 对key做了5次操作就会进行快照存储,可以配置多个,只要有一个条件成立就会快照
save 20 5
save 300 10
save 60 10000
# rdb文件名 用默认的即可
dbfilename dump.rdb

演示

不使用rdb

启动Redis
不配置rdb启动Redis
进入Redis客户端并添加数据
进入Redis客户端并添加数据
关闭Redis
关闭Redis
开启Redis
开启Redis
进入Redis客户端并获取key

可以发现我们在上面的数据已经丢失了,然后让我们把Redis关掉在使用rdb试一下。
进入Redis客户端并获取key

使用rdb

配置文件配置rdb
配置文件配置rdb

启动Redis
启动Redis
看一下在配置文件中配置的持久化文件存储路径下是否有rdb文件

可以看到该路径下只有一个pid文件,该文件是Redis启动后存放pid的文件,并没有rdb文件。
看一下在配置文件中配置的持久化文件存储路径下是否有rdb文件
进入Redis客户端,在20s内操作5次key并退出
进入Redis客户端,在20s内操作5次key并退出
看一下在配置文件中配置的持久化文件存储路径下是否有rdb文件
看一下在配置文件中配置的持久化文件存储路径下是否有rdb文件
关闭Redis
关闭Redis
开启Redis
开启Redis
进入Redis客户端并获取key

我在20s内写到了 k7,但是可以看到Redis重启之后恢复到内存中的数据只有5个,是因为这五个是我在20s之内操作的,Redis的RDB记录下来了。另外三个数据的丢失,有一个是因为在20s之外操作的所以没有记录,如果想要记录下来的话,那么在配置文件里可以加上save 1 1,这代表在1s内操作1次就会记录下来,还有两个虽然是在20s之内操作的但是也没有记录,是因为我们在配置文件中只设置了三个记录的条件,分别为20s操作5次记录、300s操作10次记录、60s操作10000次记录;很显然,丢失的那两个数据并没有条件成立,所以数据就会丢失,解决办法有两个:一个是加上save 20 7,20s内操作7次记录,另一个就是加上save 3 2,3s内操作2次记录。
进入Redis客户端并获取key

特点

  • 根据save的配置,在指定时间范围内对key操作达到指定次数才会对内存做快照
  • 如果你想立马对内存做快照可以使用 save 命令
  • 启动Redis时根据配置文件中的dirdbfilename找到快照文件将数据存恢复到内存中
  • 有可能丢失一段时间内的数据,快照文件中只有数据,恢复数据是很快的

RDB的优点

  • RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,这样即使出了问题你也可以根据需求恢复到不同版本的数据集。
  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复。
  • RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。
  • 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

RDB的缺点

  • 如果你希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据。
  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

AOF

介绍

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大,AOF默认是关闭的,需要开启。

配置

# 配置持久化文件存储路径
dir "/var/redis-5.0.5/data"
# 开启aof
appendonly yes
# 文件名
appendfilename "appendonly.aof"
# 持久化策略,no:不同步,everysec:每秒一次,always:总是同步,速度比较慢
# appendfsync always
appendfsync everysec
# appendfsync no

演示

开启Redis
开启Redis
看一下在配置文件中配置的持久化文件存储路径下是否有aof文件

&esmp;Redis开启AOF后,启动Redis后,Redis就会创建一个aof的文件,但是文件里面什么都没有,是空的。
看一下在配置文件中配置的持久化文件存储路径下是否有aof文件
进入Redis客户端并获取一下key
进入Redis客户端并获取一下key
看一下aof文件中是否有读操作的命令记录

可以看到aof中并没有读操作的命令,aof只会记录Redis的写操作(添加,修改,删除)而不会去记录读操作。
看一下aof文件中是否有读操作的命令记录
在Redis客户端添加数据
在Redis客户端添加数据
看一下aof中是否有添加记录

可以看到在aof文件中有我们刚刚添加的k1 v1,k2 v2等数据,aop文件中还有一个SELECT的单词,这里要注意一下,这个SELETE并不是SQL语句中的查询,而是Redis的换库命令。Redis共有16个库,我们当前所处的是Redis的默认0号库,在SELECT下面第二个有一个0,这代表0号库,Redis的数据恢复也一定要注意这些数据是在哪个库里面存着的。
看一下aof中是否有添加记录
关闭Redis
关闭Redis
启动Redis
启动Redis
进入Redis客户端查看是否有数据
可以看到,数据都恢复到了内存中。
进入Redis客户端查看是否有数据

特点

  • 将Redis服务写命令,存储在aof文件中,并且包含select换库命令
  • 默认关闭,需要修改配置打开
  • 与RDB一起存在恢复数据时优先使用aof

优点

  • 使用AOF 会让你的Redis更加耐久::你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync。使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。
  • AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题。
  • Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis,就可以将数据集恢复到 FLUSHALL 执行之前的状态。

缺点

  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依
    然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过
    在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。

总结

Redis的持久化东西还是蛮多的,只是配置相对简单一些,这些是一些基础的配置,后面如果Redis做一些主从复制,Redis Cluster集群配置的时候,就会有一些更复杂的难度了。


版权声明:本文为fate2021fate原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。