Redis - 持久化机制详解(RDB、AOF、混合持久化)
作者:hangge | 2024-12-04 08:30
1,概述
(1)Redis 是一个内存数据库,为了防止数据丢失,它提供了持久化机制,将数据存储到磁盘上。Redis 有两种主要的持久化方式:RDB(Redis DataBase)快照和 AOF(Append-Only File)日志。
(2)在实际应用中,可以同时使用 RDB 和 AOF,以兼顾快速的数据恢复和较小的数据备份。这种情况下,Redis 会首先使用 AOF 文件进行数据恢复,如果 AOF 文件不存在或损坏,则使用最近的 RDB 快照文件。
2,RDB(Redis DataBase)快照
(1)RDB 持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是 Redis 默认的持久化方式。
(2)触发方式:可以通过执行 SAVE 或 BGSAVE 命令进行手动触发,也可以配置条件进行自动触发。
- 比如 redis.conf 文件中我们设置如下三个触发条件,里面的三个时机哪个先满足都会执行快照操作。
- 其中 save 3600 1 表示 3600 秒内至少一个 key 被更改则进行快照,其他两个条件同理。
save 3600 1 save 300 100 save 60 10000
(3)文件格式:生成的快照文件是一个二进制文件,以.rdb 为扩展名,包含了数据库在某个时间点的所有键值对信息。
(4)优点:
- 对于大数据集,RDB 的性能优于 AOF。适合大规模的数据恢复场景,如备份,全量复制等。
(5)缺点:
- RDB 是定时快照,没办法做到实时持久化/秒级持久化,可能会丢失最后一次快照后的数据变更。
- 在快照期间,Redis 可能会占用大量内存。
- 新老版本存在 RDB 格式兼容问题。
3,AOF(Append-Only File)日志
(1)AOF 持久化采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行 AOF 文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的,可以通过修改 redis.conf 文件中 appendonly 参数开启:
appendonly yes
(2)触发方式:appendfsync 参数决定 redis 什么时候会把用户的写命令同步到 aof 文件中:
- appendfsync everysec:每秒钟执行一次同步操作(默认值)
- appendfsync always:执行一次写操作就执行一次同步操作,但是这样效率会有点低。
- appendfsync no:不主动进行同步,由操作系统来做,30 秒执行一次。
(3)文件格式:AOF 文件是一个文本文件,包含了 Redis 服务器所执行的写命令。该保存位置和 RDB 文件相同,都是 dir 参数设置的,默认的文件名是 appendonly.aof
注意:dir 参数的值为. 表示当前目录,也就是说我们在哪个目录下启动 redis,rdb 快照文件和 aof 日志文件就产生在哪个目录下。
(4)优点:
- AOF 提供了更加灵活的持久化方式,可以配置不同的同步频率。
- 数据的完整性更好。
(5)缺点:
- AOF 文件相对较大,可能会占用更多的磁盘空间。
- 在 AOF 文件较大时,Redis 启动可能会比 RDB 慢。
4,混合持久化
(1)Redis 4.0 提出了将 RDB 和 AOF 合体使用的方法,该方法叫混合使用 AOF 日志和内存快照,也叫混合持久化。如果想要开启混合持久化功能,可以在 Redis 配置文件将下面这个配置项设置成 yes:
aof-use-rdb-preamble yes
(2)混合持久化工作在 AOF 日志重写过程。也就是说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。
- 当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件
- 然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件
- 写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。
(3)这样的好处在于:
- 重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。
- 加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得数据更少的丢失。
全部评论(0)