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

相关推荐
何其有幸.5 小时前
实验3-3 比较大小(PTA|C语言)
c语言·数据结构·算法
柏油5 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。5 小时前
使用Django框架表单
后端·python·django
白泽talk5 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师5 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫6 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04126 小时前
HTTP调用超时与重试问题分析
后端
东阳马生架构6 小时前
Sentinel源码—8.限流算法和设计模式总结二
算法·设计模式·sentinel
颇有几分姿色6 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack6 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端