卡码笔记-最强八股文
首页
计算机基础
C++
Java
Go
大模型
  • Java面经
  • C++面经
  • 大模型面经
简历专栏
代码随想录 (opens new window)
首页
计算机基础
C++
Java
Go
大模型
  • Java面经
  • C++面经
  • 大模型面经
简历专栏
代码随想录 (opens new window)
  • 操作系统

  • 网络

  • 数据库

    • SQL

    • 索引

    • 锁与MVCC

    • 事务

    • Redis

      • Redis常见的数据结构
      • Redis缓存淘汰策略
      • Redis过期策略
      • Redis持久化机制:RDB和AOF
        • 简要回答
        • 详细回答
        • 知识图解
        • 代码示例
        • 知识扩展
      • 缓存雪崩、穿透、击穿
      • Redis分布式锁
      • Redis布隆过滤器
      • Redis主从同步
    • 其他

# Redis的持久化机制是什么?RDB和AOF有什么区别?

# 简要回答

  • Redis 持久化的核心方案有两种:RDB 快照和 AOF 追加日志。除此之外,生产中也常见 RDB + AOF 或混合持久化方案。
  • RDB 是在某个时间点把内存数据做成快照落盘,优点是文件紧凑、恢复速度快,缺点是两次快照之间的数据可能丢失。
  • AOF 是把写命令按追加方式记录到文件中,优点是数据更完整、可通过刷盘策略控制丢失范围,缺点是文件更大、恢复通常比 RDB 慢。
  • 如果同时开启 RDB 和 AOF,Redis 重启时通常会优先使用 AOF 文件恢复,因为它通常更完整。

# 详细回答

  1. 为什么 Redis 需要持久化
    • Redis 是内存数据库,数据默认存在内存里。如果进程宕机、机器重启、实例迁移,内存里的数据会丢失。
    • 所以如果 Redis 不只是做纯缓存,而是还承载了重要业务数据,就需要持久化机制把数据落到磁盘。
  2. RDB(Redis DataBase)快照
    • RDB 的思路是在某一个时刻,把当前内存中的数据整体生成快照,写到磁盘文件里,默认文件名通常是 dump.rdb。
    • 常见触发方式:根据配置规则自动触发,如 save 900 1、或者可以手动执行 SAVE 或 BGSAVE
    • 两个命令的区别:SAVE会同步保存,会阻塞主线程,因此生产中很少直接使用。而BGSAVE是后台保存,Redis 会 fork 子进程生成快照,主线程继续处理请求。
    • 优点:rdb的文件体积通常更小,适合备份、全量复制,恢复速度通常比 AOF 更快
    • 缺点:但是RDB不能保证实时性,两次快照之间的数据可能丢失。fork 子进程时会带来额外内存和短暂开销
  3. AOF(Append Only File)追加日志
    • AOF 的思路是把每一条会修改数据的写命令追加到 AOF 文件中,Redis 重启时重新执行这些命令完成恢复。
    • 常见刷盘策略由 appendfsync 控制:如果是always则每次写命令都刷盘,最安全但性能开销最大;everysec在每秒刷盘一次,性能和安全性比较均衡,生产中很常见;如果选择no,则由操作系统决定何时刷盘,性能最好但数据风险更高。
    • 优点:数据丢失窗口通常比 RDB 更小,文件里是写命令,可读性比二进制快照更强。
    • 缺点:文件通常比 RDB 大,恢复时需要重放命令,通常比 RDB 慢
  4. AOF 重写:如果 AOF 一直追加,文件会越来越大,所以 Redis 提供了 BGREWRITEAOF 机制,用更精简的命令重新生成一份新的 AOF 文件。例如对同一个 key 的多次 INCR、SET,重写后可以合并成更少的命令,减少文件体积。
  5. 混合持久化
    • 在较常见的生产配置里,会采用 AOF 与 RDB 结合的方式。
    • 混合持久化的典型思路是:重写 AOF 时,前半段使用 RDB 快照格式保存全量数据,后半段再追加增量写命令。
    • 这样既能保留 RDB 恢复快的优点,又能保留 AOF 数据更完整的优点。
  6. 实际开发中,应该根据场景类型决定,如果是纯缓存场景,数据丢了可以从数据库重建,甚至可以关闭持久化来换性能,在重要数据场景下,通常至少开启 AOF everysec,如果希望恢复更快,同时兼顾数据安全:可以使用 RDB + AOF 或混合持久化。

# 知识图解

  1. Redis 持久化方案对比
方案 核心思路 优点 缺点
RDB 定期生成内存快照 文件小,恢复快 两次快照之间可能丢数据
AOF 追加写命令日志 数据更完整 文件更大,恢复较慢
混合持久化 RDB 快照 + AOF 增量 恢复更快且更完整 配置和机制更复杂
  1. RDB和AOP持久化示意 image

# 代码示例

save 900 1
save 300 10
save 60 10000

# 开启 AOF
appendonly yes

# AOF 每秒刷盘一次
appendfsync everysec

# 手动触发 RDB 快照
BGSAVE

# 手动触发 AOF 重写
BGREWRITEAOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 知识扩展

  1. 扩展:
    • Redis 在执行 BGSAVE 或 BGREWRITEAOF 时通常会 fork 子进程,因此大内存实例在高峰期做持久化要特别关注内存和延迟抖动。
    • 如果既开启了 RDB 又开启了 AOF,Redis 重启恢复时一般优先使用 AOF 文件。
  2. 面试官可能追问:
  • Q1:为什么生产环境更常见 appendfsync everysec?
    • 因为它在性能和可靠性之间比较平衡。极端情况下通常最多丢失 1 秒左右的数据,但比 always 的刷盘开销小很多。
  • Q2:BGSAVE 为什么比 SAVE 更常用?
    • 因为 SAVE 会阻塞主线程,期间 Redis 不能正常处理请求;BGSAVE 通过后台子进程生成快照,对线上影响更小。
  • Q3:为什么 AOF 还需要重写?
    • 因为 AOF 是追加日志,时间长了文件会非常大,重写可以把重复、冗余的历史命令压缩成更精简的结果,降低磁盘占用和恢复耗时。
Last Updated: 4/30/2026, 11:54:17 AM

← Redis过期策略 缓存雪崩、穿透、击穿 →

评论

验证登录状态...

侧边栏
夜间
卡码简历
代码随想录
卡码投递表🔥
2026群
添加客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记
鼓励/支持/赞赏Carl
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪