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