likes
comments
collection
share

Redis 持久化有哪几种方式,怎么选?

作者站长头像
站长
· 阅读数 47

一、概述

Redis提供了三种的持久化策略:RDB持久化、AOF持久化和混合持久化。

数据持久化策略
RDB快照持久化
AOF日志持久化
混合持久化

二、 RDB快照持久化

RDB持久化是通过创建数据集的时间点快照来实现的。Redis可以配置为在n秒内如果超过m个key被修改就自动做一次快照。

Redis的RDB快照持久化策略,将内存中的数据周期性地保存到磁盘上的二进制文件中。

这种方式适用于==数据量较大且对数据完整性要求不高==的场景。

2.1 Redis RDB快照持久化的流程

1、 触发快照持久化:Redis支持两种触发快照持久化的方式:

  • 手动触发:通过执行SAVE或BGSAVE命令可以手动触发快照持久化。SAVE命令会阻塞Redis服务器,直到快照生成完毕。BGSAVE命令会派生一个子进程来生成快照,Redis服务器可以继续处理其他命令。

  • 自动触发:Redis可以配置自动触发快照持久化的条件,例如设置一个时间间隔或者当指定数量的写操作执行后触发。

2、 创建RDB文件:当快照持久化被触发时,Redis会将当前的数据集写入一个新的RDB文件中。这个文件是一个二进制文件,包含了Redis数据的完整快照。

3、 写入RDB文件:Redis将内存中的数据按照一定的格式写入RDB文件。这个过程是通过遍历Redis的数据库和键值对来完成的。

4、 完成持久化:当RDB文件写入完毕后,Redis会向该文件添加一个统一的文件尾(EOF),表示快照持久化的完成。

5、 替换原有RDB文件(可选):在某些情况下,Redis可以选择替换原有的RDB文件。例如,当执行BGSAVE命令时,Redis会先创建一个新的RDB文件,然后将其重命名为原有的RDB文件,以确保原有的RDB文件一直是可用的。

2.2 Redis RDB快照持久化的流程图

客户端Redis 服务器子进程执行 SAVE / BGSAVE 命令开始 RDB 快照创建子进程 (BGSAVE)执行 RDB 快照写入 RDB 文件完成 RDB 快照向 RDB 文件添加 EOFRDB 快照完成替换原有 RDB 文件(可选)响应客户端Redis 服务器子进程

2.3 注意

==Redis RDB快照持久化是一种全量持久化方式==,即将整个数据集保存到磁盘上。

相比于AOF(Append-Only File)持久化方式,RDB快照持久化在恢复大数据集时速度更快,但可能会丢失最后一次快照之后的数据修改。

另外,为了提高持久化的效率和避免对主线程的阻塞,Redis还使用了写时复制(Copy-on-write)机制,即在执行BGSAVE命令时,Redis会创建一个子进程来处理持久化操作,而主进程则继续处理客户端的请求。这样可以减少对Redis性能的影响。

三、AOF日志持久化

AOF持久化记录了服务器接收到的所有写命令,并在服务器启动时,通过重新执行这些命令来还原数据集。Redis可以配置为每次接收到写命令就立即写入磁盘,或者每秒写入一次,或者在队列命令的数量达到一定数量时写入。

Redis的AOF日志持久化策略,它将所有对Redis的写操作追加到一个日志文件中。通过重新执行这些写操作,可以==在Redis启动时将数据恢复到最新状态==。

AOF日志相对于RDB快照具有更高的数据完整性,但也会增加写入操作的延迟。

3.1 AOF日志持久化的流程

1、 AOF持久化方式选择:在Redis的配置文件中,可以选择AOF持久化的方式,包括禁用AOF持久化、每秒钟同步一次AOF文件(always)、每次写操作都同步AOF文件(everysec)和按需同步AOF文件(no)。

2、 写入AOF缓冲区:当执行写操作时,Redis会将该写操作以协议的形式追加到AOF缓冲区中,而不是直接写入磁盘。AOF缓冲区是一个内存缓冲区,用于临时存储待持久化的写操作。

3、 AOF缓冲区同步到磁盘:根据AOF持久化方式的配置,Redis会定期或根据条件将AOF缓冲区中的内容同步到AOF文件中。具体的同步方式有三种:

  • always:每个写操作都同步到磁盘,效果最安全但性能较低。

  • everysec:每秒钟将AOF缓冲区的内容同步到磁盘,提供了较好的性能和持久化保证。

  • no:Redis将AOF缓冲区的内容交给操作系统处理,由操作系统决定何时将数据同步到磁盘,性能最高但持久化能力较弱。

在同步AOF缓冲区到磁盘时,Redis使用类似于fsync()或fdatasync()的系统调用来确保数据被写入磁盘。

4、 AOF重写(可选):为了避免AOF文件过大影响性能,Redis提供了AOF重写机制。AOF重写是将现有的AOF文件转换为一个更紧凑和优化的格式,删除了冗余的命令和操作。AOF重写是一个耗时的操作,但它可以帮助减小AOF文件的大小并提高加载AOF文件的速度。

5、 AOF文件加载:当Redis启动时,可以选择加载AOF文件来恢复数据。Redis会将AOF文件中的写操作逐个重放,从而还原数据集的状态。

3.2 AOF日志持久化的流程图

Redis 服务器客户端操作系统定期或根据条件同步AOF缓冲区到磁盘alt[AOF持久化方式为always][AOF持久化方式为everysec][AOF持久化方式为no]数据持久化完成alt[AOF重写被触发]AOF持久化完成alt[Redis启动时-加载AOF文-件]执行写操作将写操作追加到AOF缓冲区请求将AOF缓冲区同步到磁盘将AOF缓冲区同步到AOF文件响应写操作结果确认数据已写入磁盘确认数据已写入磁盘 (每秒同步)确认数据已接收启动AOF重写读取现有AOF文件生成优化的AOF文件写入新的AOF文件读取AOF文件重放写操作Redis 服务器客户端操作系统

3.3 注意

AOF持久化方式相对于RDB快照持久化来说,提供了更好的数据恢复能力,因为AOF文件包含了每个写操作的详细记录。

然而,相比于RDB快照持久化,AOF持久化在写入性能方面可能会有一些损失,因为每个写操作都需要被追加到AOF缓冲区和写入磁盘。

四、 混合持久化

为了==兼顾RDB快照和AOF日志的优点==,Redis还提供了混合持久化策略。

在这种策略下,可以同时启用RDB快照和AOF日志,以实现更好的数据保护和恢复能力。

4.1 Redis混合持久化的流程

1、 初始化恢复:当Redis启动时,会优先尝试加载AOF文件来进行数据恢复。如果AOF文件不存在或加载失败,则尝试加载RDB文件进行数据恢复。

2、 写入操作处理

  • 写入操作执行:当执行写操作时,Redis会将该操作同时应用于内存数据集和AOF缓冲区。

  • AOF缓冲区同步:根据AOF持久化的配置方式,Redis会定期或根据条件将AOF缓冲区中的内容同步到AOF文件中。

  • RDB快照持久化:根据RDB持久化的配置方式,Redis会定期或根据条件执行RDB快照持久化,将内存数据集保存到磁盘上的RDB文件中。

3、 AOF重写:为了避免AOF文件过大影响性能,Redis提供了AOF重写机制。AOF重写是将现有的AOF文件转换为一个更紧凑和优化的格式,删除了冗余的命令和操作。AOF重写操作会创建一个新的AOF文件。

4、 AOF文件加载:当Redis启动时,可以选择加载AOF文件来恢复数据。如果AOF文件存在且加载成功,则会忽略RDB文件的加载,直接从AOF文件中重放写操作以还原数据集的状态。

4.2 Redis混合持久化的流程图

Redis 服务器客户端操作系统启动初始化alt[RDB文件加载成-功][RDB文件加载失-败]alt[AOF文件加载成功-][AOF文件加载失败-]alt[RDB文件加载成-功][RDB文件加载失-败]alt[尝试加载AOF文件-][尝试加载RDB文件-]定期或根据条件同步AOF缓冲区到磁盘alt[AOF持久化方式为always][AOF持久化方式为everysec][AOF持久化方式为no]alt[RDB持久化触发条件满足]alt[AOF重写触发条件满足]loop[持续写入操作]持久化完成Redis关闭时,可以选择加载AOF文件来恢复数据alt[RDB文件加载成-功][RDB文件加载失-败]alt[AOF文件存在且加-载成功][AOF文件不存在或-加载失败]加载AOF文件重放AOF文件中的写操作尝试加载RDB文件恢复RDB文件中的数据数据库为空加载RDB文件恢复RDB文件中的数据数据库为空执行写操作将写操作应用于内存数据集将写操作追加到AOF缓冲区请求将AOF缓冲区同步到磁盘响应写操作结果确认数据已写入磁盘确认数据已写入磁盘 (每秒同步)确认数据已接收执行RDB快照持久化保存内存数据集到RDB文件启动AOF重写读取现有AOF文件生成优化的AOF文件写入新的AOF文件重放AOF文件中的写操作尝试加载RDB文件恢复RDB文件中的数据数据库为空Redis 服务器客户端操作系统

4.3 注意

Redis混合持久化结合了RDB快照持久化和AOF日志持久化的优势。

RDB快照持久化提供了紧凑的数据表示和快速恢复的能力,适用于大规模的数据恢复。

而AOF日志持久化记录了每个写操作的详细日志,提供了更好的数据恢复精度和故障恢复能力。

通过混合持久化,可以在性能和数据安全之间找到一个平衡点,满足应用的需求。

五、redis几种持久化策略怎么选择?

选择适合的持久化策略取决于应用的需求和特定场景的要求。一般取决于对数据安全性、恢复能力和性能的需求。

选择持久化策略的注意事项
数据安全性
性能
恢复能力

下面是每种持久化策略的特点和适用场景。

RDB快照持久化

1、 特点:RDB快照持久化将Redis的内存数据集以二进制格式保存到磁盘上的RDB文件中。它是一种全量持久化方式,适用于定期备份和恢复数据集。

2、 适用场景:

  • 数据备份:当需要将Redis数据集定期备份到磁盘上时,RDB快照持久化是一个好的选择。

  • 数据恢复速度要求较高:RDB快照持久化可以快速将整个数据集从磁盘加载到内存,恢复速度较快。

AOF日志持久化

1、 特点:AOF日志持久化记录了每个写操作的详细日志,以追加的方式写入AOF文件中。它是一种增量持久化方式,适用于保证数据完整性和故障恢复。

2、 适用场景:

  • 数据完整性要求高:AOF日志持久化以追加方式记录每个写操作,可以提供更精确的数据恢复能力,适用于对数据完整性要求较高的场景。

  • 故障恢复能力要求高:AOF日志持久化允许在Redis重新启动时重放AOF文件中的写操作,可以更可靠地恢复数据。

混合持久化

1、 特点:混合持久化结合了RDB快照持久化和AOF日志持久化的优点,提供了更好的数据恢复能力和性能。

2、 适用场景:

  • 数据安全和性能需求兼顾:混合持久化可以在数据安全和性能之间找到一个平衡点,结合了RDB快照和AOF日志的优势。

  • 高可用性要求:通过同时使用RDB快照和AOF日志,可以提供更好的故障恢复和数据保护能力。

转载自:https://juejin.cn/post/7279265985911668772
评论
请登录