每日一篇高频面试题之 Redis 持久化

文章目录

  • [每日一篇高频面试题之 Redis 持久化](#每日一篇高频面试题之 Redis 持久化)
    • 前言
    • 一、面试经典原题
    • [二、Redis 持久化概述](#二、Redis 持久化概述)
      • [1. 持久化的作用](#1. 持久化的作用)
      • [2. 两大持久化方案](#2. 两大持久化方案)
    • [三、RDB 快照持久化](#三、RDB 快照持久化)
    • [四、AOF 日志持久化](#四、AOF 日志持久化)
      • [1. 核心原理](#1. 核心原理)
      • [2. 三种刷盘策略(`appendfsync`)](#2. 三种刷盘策略(appendfsync))
      • [3. AOF 重写(Rewrite)](#3. AOF 重写(Rewrite))
      • [4. 优点](#4. 优点)
      • [5. 缺点](#5. 缺点)
      • [6. 适用场景](#6. 适用场景)
    • [五、RDB 与 AOF 核心对比](#五、RDB 与 AOF 核心对比)
    • 六、生产环境最佳实践
      • [1. 混合持久化(Redis 4.0+ 推荐)](#1. 混合持久化(Redis 4.0+ 推荐))
      • [2. 单独使用场景](#2. 单独使用场景)
      • [3. 线上避坑要点](#3. 线上避坑要点)
    • 七、宕机恢复完整流程
    • 八、高频灵魂追问
      • [1. fork 子进程为什么会阻塞主线程?](#1. fork 子进程为什么会阻塞主线程?)
      • [2. AOF 重写期间会丢失数据吗?](#2. AOF 重写期间会丢失数据吗?)
      • [3. 为什么 AOF 恢复速度比 RDB 慢?](#3. 为什么 AOF 恢复速度比 RDB 慢?)
      • [4. 可以关闭持久化吗?](#4. 可以关闭持久化吗?)
    • [九、30 秒面试背诵版](#九、30 秒面试背诵版)
    • 十、小测验

每日一篇高频面试题之 Redis 持久化

适合:春招 / 跳槽 / 转行 | 级别:Java 中初级开发 | 难度:⭐⭐⭐⭐ | 频率:极高


前言

关注公众号 "知识汲取者"【面试题】合集,可以每天抽空五分钟,趁着坐车、蹲坑、摸鱼等琐碎时间看一看,一来可以扎实基本功 ,二来可以随时熟悉面试题,让我们始终保持拥有随时可面的状态,时刻保持危机意识。

本专栏适合人群:

  1. 在职的开发人员
  2. 准备或正在跳槽的开发人员
  3. 未来想从事开发工作

一、面试经典原题

  1. Redis 为什么需要持久化?
  2. Redis 有哪两种持久化方式?RDB 和 AOF 原理、优缺点、使用场景分别是什么?
  3. RDB 和 AOF 如何配合使用?
  4. 持久化过程是否会阻塞主线程?如何优化?
  5. 宕机恢复数据流程是什么?

二、Redis 持久化概述

1. 持久化的作用

Redis 是内存数据库,数据默认存放在内存中,服务重启、机器宕机后内存数据会全部丢失。

持久化就是把内存数据定期写入磁盘,实现数据落地,保障数据不丢失,重启后可快速恢复数据。

2. 两大持久化方案

Redis 主流提供两种持久化机制:

  • RDB(Redis Database):快照持久化
  • AOF(Append Only File):日志追加持久化

三、RDB 快照持久化

1. 核心原理

指定时间节点 ,把内存中全量数据 生成二进制快照文件(.rdb)保存到磁盘。

Redis 通过 fork() 创建子进程,由子进程完成快照写入,最大程度减少主线程阻塞。

2. 触发方式

(1)自动触发(配置规则)

redis.conf 中配置 save 规则,满足条件自动执行:

conf

复制代码
# 示例:900秒内至少1个key变化、300秒内至少10个key变化、60秒内至少10000个key变化,触发RDB
save 900 1
save 300 10
save 60 10000
(2)手动触发
  • save:主线程执行快照,全程阻塞,线上不推荐
  • bgsave:fork 子进程执行快照,主线程不阻塞,线上常用
(3)其他触发

执行 flushall、主从复制全量同步时,也会自动触发 RDB。

3. 优点

  1. 文件是紧凑二进制格式,体积小,传输、备份、恢复速度快
  2. 恢复数据速度远快于 AOF
  3. bgsave 依靠子进程执行,对主线程影响小

4. 缺点

  1. 存在数据丢失风险:两次快照之间的数据,宕机会全部丢失
  2. 频繁快照会产生大量磁盘 IO,影响性能
  3. 数据量大时,fork 子进程会消耗内存,产生短暂阻塞

5. 适用场景

适合冷备份、全量数据迁移、对数据完整性要求不极致、允许少量数据丢失的场景。


四、AOF 日志持久化

1. 核心原理

独立日志文件 形式,逐条记录客户端所有写命令(读命令不记录)。

Redis 执行一条写操作,就将命令追加到 AOF 日志末尾,重启时重新回放日志恢复数据。

2. 三种刷盘策略(appendfsync

控制日志从内存缓冲区写入磁盘的时机,是 AOF 性能与数据安全的核心:

  1. always :每执行一条写命令,立即刷盘。数据安全性最高,几乎不丢数据,性能最差
  2. everysec (默认):每秒刷一次盘。最多丢失1 秒数据,性能与安全性均衡,线上主流选择。
  3. no:交由操作系统自行调度刷盘。性能最好,宕机可能丢失大量数据。

3. AOF 重写(Rewrite)

产生原因

长期运行下,AOF 文件会不断膨胀(如多次修改同一个 key,会记录多条重复命令),文件体积过大、回放缓慢。

原理

Redis 开启子进程,读取当前内存数据,生成精简后的新命令集,替换旧 AOF 文件,压缩文件体积。

重写过程不会暂停正常写请求,新命令会继续追加到临时缓冲区。

4. 优点

  1. 数据安全性高,默认策略最多丢失 1 秒数据,可做到近乎不丢数据
  2. 日志文件是文本格式,可直接查看、手动修改

5. 缺点

  1. 同等数据量下,AOF 文件体积远大于 RDB
  2. 数据恢复时,需要逐条回放命令,速度比 RDB 慢很多
  3. 频繁刷盘、文件重写会带来一定 IO 压力

6. 适用场景

数据完整性要求高,不允许大量数据丢失的业务场景。


五、RDB 与 AOF 核心对比

表格

对比项 RDB AOF
存储内容 全量二进制数据快照 增量写命令日志
数据丢失 可能丢失大量数据 默认最多丢失 1 秒数据
文件体积 小,压缩率高 大,命令逐条记录
恢复速度
性能影响 低(子进程执行) 较高(持续刷盘 + 重写)
格式 二进制,不可读 文本格式,可查看编辑

六、生产环境最佳实践

1. 混合持久化(Redis 4.0+ 推荐)

同时开启 RDB + AOF:

  1. 日常依靠 AOF 保障数据安全,最大程度减少数据丢失
  2. 定时执行 RDB 做全量快照,用于冷备份、数据迁移
  3. 重启恢复时:优先加载 RDB 快照,再回放 AOF 增量日志,兼顾速度与安全性

2. 单独使用场景

  • 允许少量数据丢失、侧重备份与恢复:只开 RDB
  • 数据绝对不能大量丢失:只开 AOF(选用 everysec 策略)

3. 线上避坑要点

  1. 禁止使用 save 命令,一律用 bgsave,避免主线程阻塞
  2. 根据业务选择 AOF 刷盘策略,不建议使用 always(性能过低)
  3. 合理配置 AOF 重写触发阈值,避免频繁重写
  4. 大内存实例注意 fork 子进程带来的内存开销

七、宕机恢复完整流程

  1. Redis 重启,优先检查持久化文件
  2. 若同时开启 RDB+AOF:先加载 RDB 全量快照,再执行 AOF 增量日志
  3. 仅开启 RDB:直接加载 .rdb 文件恢复数据
  4. 仅开启 AOF:逐条回放 AOF 日志文件恢复数据
  5. 无任何持久化文件:启动后为空库,数据完全丢失

八、高频灵魂追问

1. fork 子进程为什么会阻塞主线程?

fork 系统调用需要拷贝页表,内存越大,拷贝耗时越长,会造成短暂阻塞;子进程创建完成后,快照、日志操作均在子进程执行,不再阻塞主线程。

2. AOF 重写期间会丢失数据吗?

不会。重写过程中新的写命令会存入缓冲区,重写完成后一并追加到新文件,保证数据完整。

3. 为什么 AOF 恢复速度比 RDB 慢?

RDB 是直接加载二进制数据;AOF 需要逐条解析、执行日志中的写命令,步骤更多,耗时更长。

4. 可以关闭持久化吗?

纯缓存场景(数据可重新从数据源查询)可以关闭持久化,提升性能;有状态数据严禁关闭


九、30 秒面试背诵版

Redis 持久化分为 RDB 快照和 AOF 日志两种方式。RDB 定时生成全量二进制快照,文件小、恢复快,但会丢失时段内数据;AOF 持续追加写命令日志,数据安全性高,默认最多丢 1 秒数据,但文件大、恢复慢。生产环境推荐两者同时开启,AOF 保障实时数据安全,RDB 做定时冷备份,宕机重启优先加载 RDB 再回放 AOF,兼顾性能与数据安全。


十、小测验

  1. 简述 RDB 和 AOF 的原理及核心优缺点?
  2. AOF 有哪三种刷盘策略,区别是什么?
  3. 什么是 AOF 重写,作用是什么?
  4. 生产环境为什么建议 RDB + AOF 配合使用?

点赞 + 收藏,每天 5 分钟,面试稳稳上岸 ✨

相关推荐
前端不太难6 小时前
鸿蒙游戏需要 GameEngine 吗?
游戏·状态模式·harmonyos
薛定猫AI1 天前
【深度解析】大模型编码能力评测:Reasoning Effort、Agentic Workflow 与多模型 API 实战
状态模式
木斯佳1 天前
前端八股文面经大全:字节跳动-存储部门一面(2026-05-29)·面经深度解析
前端·状态模式
C+++Python1 天前
线性状态和状态模式有什么区别?
状态模式
边界条件╝2 天前
微前端进阶(四)
前端·状态模式
我是一颗柠檬2 天前
【Java后端技术亮点】动态路由权限(按钮级权限),细粒度控制到按钮级别
java·开发语言·后端·状态模式
霸道流氓气质2 天前
Excel 数据导出实战指南
excel·状态模式
布局呆星2 天前
HTML+fastAPI+Dify|打通前后端至智能体的路
状态模式
霸道流氓气质2 天前
批量异步处理 + MQ + Redis 进度追踪实战指南
数据库·redis·状态模式