蜗牛大师

吴庆龙的学习笔记

导航

Redis持久化的方式

分为:
  • RDB持久化:二进制格式,save/bgsave 命令产生。
  • AOF持久化:客户端命令,追加写入,文件大。

一、RDB持久化

1、什么是RDB持久化

英文名称是 Redis DataBase,它还有一个常用的名字:快照持久化。所谓快照,在这里指的是某一时刻的内存数据,而持久化则是将这一时刻的数据以二进制形式写入到磁盘里。

2、手动触发机制

(1)save 命令
手动执行 save 命令产生 RDB 持久化数据文件。
 
但是,因为 Redis 对于客户端的命令时串行执行的,所以当执行 save 命令时,因为执行时间较长,会堵塞其它命令的执行。不推荐在线上环境使用。
 
(2)bgsave 命令
与 save 不同的是,执行过程中它并不会阻塞客户端的请求。而是将持久化工作交给子进程来执行,主进程仍负责客户端请求的处理工作。

3、自动触发机制

自动触发通常是 Redis 中配置文件来执行的。有这么个配置你需要了解下:
save m n
其中 m 代表秒数,n 代表次数,放在一起表示的是 m 秒内发生 n 次变化时,会触发 bgsave。
 
了解了自动化配置,我们再来看下 Redis 配置文件 redis.conf 中的三个配置项:
save 900 30
save 500 10
save 200 1
`save 900 30` 表示的是时间900秒内,如果 Redis 中数据发生了 30 次变化,就会执行 bgsave。后边两个就不用介绍了,一样的原理。
看到这三个配置项,不知道你会不会有疑问,这三个到底该执行哪一个?答案是设置多个 save m n 命令时,满足任何一个条件都会触发持久化,可以理解为或关系。

4、RDB 文件恢复

当 Redis 服务器重启时,在数据目录(dir 的配置值)下检测到 dump.rdb 文件后,会自动加载进行数据恢复。

二、AOF持久化

1、什么是AOF持久化

与 RDB 不同的是,它保存的数据格式是客户端发送的命令。

2、AOF实现方式

想要使用 AOF 持久化方式,需要启用配置文件中的 appendonly 参数。默认情况下,Redis 是不开启的。
appendonly yes
开启 AOF 持久化后每执行一条修改数据的命令,Redis 就会将该命令写入 aof_buf 缓冲区。后续写入 AOF 文件中的操作是由下面的配置来控制的:
appendonly always # 每次写入都进行刷盘操作,对性能影响最大,占用磁盘 IO 较高,数据安全性最高。
appendonly everyesc # 1秒刷一次盘,对性能影响相对较小。
appendonly no # 按照操作系统的机制进行刷盘,对性能影响最小,数据安全性低。

3、AOF 重写机制

随着命令的不断写入,AOF 文件会变得越来越大,这时候该如何是好呢?别急,Redis 中提供了瘦身功能,也就是重写机制。
Redis 配置文件中有两个对应的参数是来决定重写机制的触发时机的。
auto-aof-rewrite-precentage 100 # AOF 文件距离上次文件增长超过多少百分比
auto-aof-rewrite-min-size 64mb # AOF 文件体积最小多大以上触发
满足所设置的条件时,会自动触发 AOF 重写,此时 Redis 会扫描整个实例的数据,重新生成一个 AOF 文件来达到瘦身的效果。

4、AOF 文件恢复

和 RBD 不同的是,Redis 中是通过创建一个不带网络连接的伪客户端来进行实现的。
 
注意:如果服务器开启了 AOF 持久化功能,会优先使用 AOF 文件来进行恢复。只有在 AOF 关闭状态下,服务器才会使用 RDB 文件来进行恢复。

三、两种持久化的优/缺点

1、RDB

优点:
  • 备份文件小,恢复快。
缺点:
  • 备份时间间隔大,服务宕机会丢失很多数据。

2、AOF

优点:
  • 顶多丢失1秒的数据,使用追加方式写入文件,速度快。
  • 可读性强,易于修改命令。
缺点:
  • 文件体积大。
  • 恢复速度慢。

四、混合持久化

既然 RDB 与 AOF 持久化都存在各自的缺点,那么有没有一种更好的持久化方式?
接下来要介绍的是混合持久化。其实就是 RDB 与 AOF 的混合模式,这是 Redis4 之后新增的。

1、持久化方式

混合持久化是通过 aof-use-rdb-preamble 参数来开启的。它的操作方式是这样的,在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。这样既能保证数据恢复时的速度,同时又能减少数据丢失的风险。

2、文件恢复

那么混合持久化中是如何来进行数据恢复的呢?在 Redis 重启时,先加载 RDB 的内容,然后再重放增量 AOF 格式命令。这样就避免了 AOF 持久化时的全量加载,从而使加载速率得到大幅提升。

五、总结

1、RDB持久化

将某一时刻的数据以二进制形式写入到磁盘里,服务重启时检测到对应文件自动加载进行数据恢复。
有手动触发和自动触发两种机制。

2、AOF持久化

以文件追加的方式写入客户端执行的写命令。
数据恢复时,通过创建伪客户端的方式执行命令,直到恢复完成。

3、混合持久化

在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。 

posted on 2021-03-01 15:27  蜗牛大师  阅读(136)  评论(0编辑  收藏  举报