1. 前言
Redis 的设计核心是提供快速的查询和存储能力,所以所有的数据都被存储在内存中。相对于硬盘,内存中的数据是半持久化存储,当遇到不可抗阻力,例如断电或者硬件损坏导致的服务器宕机时,内存中的数据会完全丢失。为了防止 Redis 中的数据丢失,需要将数据持久化存储到硬盘。
2. 持久化方案
面试官提问: Redis 的持久化方案有哪些?这些方案之间有什么区别?
题目解析:
首先给出持久化的定义:持久化是把 Redis 数据从内存同步到硬盘的过程。
其次给出 Redis 中两种持久化方案:
- RDB 持久化:将 Redis 的数据定时 dump 到硬盘;
- AOF 持久化:将 Redis 的操作日志追加写入硬盘文件。
在 Redis 的 redis.conf
文件中,预先提供了 RDB 和 AOF 的配置方案。
2.1 RDB 方式
RDB 持久化方式的步骤是:
(1)定时从 Redis 主进程 fork 一个 Redis 子进程;
(2)Redis 子进程生成内存的数据快照,并且写入 RDB 临时文件;
(3)临时文件写入成功后,生成 RDB 最终文件。
RDB 同步有三种触发机制:save 指令、bgsave 指令、自动化指令
- save 指令:命令会阻塞当前 Redis 服务器,导致 Redis 暂时不可用;
- bgsave 指令:命令在后台异步执行操作,Redis 服务器同时也能响应客户端请求,阻塞只发生在 fork 时间段,时间很短。
- 自动化指令:在
redis.conf
文件配置,例如数据在经过 m 次修改后自动触发 bgsave 命令。
简单来说,因为 save 指令会在整个过程中阻塞服务器,所以线上生产环境都是使用 bgsave 指令。
2.2 AOF 方式
AOF 持久化方式以日志形式记录 Redis 服务器的每一个插入、修改、删除操作,以文本的形式异步保存。
2.3 对比
在介绍完了两种同步方式后,需要和面试官解释两种方式的特点。
RDB 方式的优点:
(1)性能较高:在开始持久化时,只需要 fork 出一个子进程,子进程负责持久化的工作,避免主线程的 IO 操作。
(2)启动效率高:相对于 AOF 方式,如果数据集非常大, 启动速度更快。
RDB 方式的缺点:
(1)如果服务器在定时持久化之前宕机,那么 Redis 中没来得及写入的数据都会丢失。
AOF 的优点:
(1)数据安全:每次修改都会同时追加到日志文件,就算服务器宕机,数据也能在日志文件中找回。
(2)方便重建:日志文件同 MySQL 的 binlog 功能相同,我们所有的写操作都能从日志文件中获取。
AOF 的缺点:
(1)运行效率低:AOF 方式本质上是牺牲缓存的性能,来换去缓存的一致性。
(2)占用文件更大:AOF 的日志文件相对 RDB 同步的文件,通常要更大,所以在恢复时速度更慢。
3. 小结
本章节介绍了 Redis 的持久化方式,RDB 和 AOF 方式各有特点,需要衡量生产环境的不同需求定制化选择。如果偏向高性能,则选择 RDB 方式,如果需要数据高一致性,那么选择 AOF 方式。