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

一、概述

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

graph TB A(数据持久化策略) ---> B(RDB快照持久化) A(数据持久化策略) ---> C(AOF日志持久化) A(数据持久化策略) ---> D(混合持久化) style B fill:#f67b6d,stroke:#f67b6d,stroke-width:2px style C fill:#ffb025,stroke:#ffb025,stroke-width:2px style D fill:#ffe340,stroke:#ffe340,stroke-width:2px

二、 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快照持久化的流程图

sequenceDiagram participant 客户端 participant Redis 服务器 participant 子进程 客户端->>Redis 服务器: 执行 SAVE / BGSAVE 命令 Redis 服务器->>Redis 服务器: 开始 RDB 快照 Redis 服务器-->>子进程: 创建子进程 (BGSAVE) 子进程->>Redis 服务器: 执行 RDB 快照 Redis 服务器->>Redis 服务器: 写入 RDB 文件 Redis 服务器-->>子进程: 完成 RDB 快照 Redis 服务器->>Redis 服务器: 向 RDB 文件添加 EOF Redis 服务器-->>Redis 服务器: RDB 快照完成 Redis 服务器->>Redis 服务器: 替换原有 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日志持久化的流程图

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

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混合持久化的流程图

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

4.3 注意

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

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

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

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

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

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

graph LR A(选择持久化策略的注意事项) --> B(数据安全性) A(选择持久化策略的注意事项) --> C(性能) A(选择持久化策略的注意事项) --> D(恢复能力) style B fill:#FFC0CB,stroke:#FFC0CB,stroke-width:2px style C fill:#00FFFF,stroke:#00FFFF,stroke-width:2px style D fill:#98FB98,stroke:#98FB98,stroke-width:2px

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

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日志,可以提供更好的故障恢复和数据保护能力。

相关推荐
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
杜杜的man5 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布5 小时前
Java中Properties的使用详解
java·开发语言·后端
2401_857610036 小时前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
ChoSeitaku7 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___7 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我7 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
sam-1237 小时前
k8s上部署redis高可用集群
redis·docker·k8s