732 字
4 分钟
Redis 的 AOF 刷盘和重写有什么区别?
  1. 1Redis 系列导读:知识地图、必会主线与复习顺序
  2. 2Redis 中常见的数据类型有哪些?
  3. 3Redis 通常应用于哪些场景?
  4. 4Redis为什么这么快?
  5. 5Redis 常用的过期时间、删除 Key 命令有哪些?
  6. 6Redis 的过期 Key 是如何被删除的?
  7. 7Redis 内存满了怎么办?有哪些淘汰策略?
  8. 8缓存穿透、击穿、雪崩的区别与解决方案
  9. 9Redis 如何保证缓存与数据库的数据一致性?
  10. 10Redis 的持久化机制有哪些?
  11. 11Redis 主从复制的完整流程是什么?
  12. 12Redis 的哨兵机制是什么?
  13. 13Redis Cluster 模式与 Sentinel 模式的区别是什么?
  14. 14Redis 支持事务吗?如何实现?
  15. 15Redis 中如何实现分布式锁?
  16. 16Redis 的 Lua 脚本功能是什么?如何使用?
  17. 17如何解决 Redis 中的热点 Key 问题?
  18. 18Redis BigKey 有什么危害?如何发现和治理?
  19. 19为什么 Redis 设计为单线程?6.0 版本为何引入多线程?
  20. 20Redis 的 LRU 和 LFU 有什么区别?
  21. 21Redis 数据类型和底层编码有什么区别?
  22. 22Redis 中跳表的实现原理是什么?
  23. 23Redis 的 ZSet 为什么使用跳表,而不是平衡树?
  24. 24Redis 的 RDB 快照如何生成?为什么会有写时复制?
  25. 25Redis 的 AOF 刷盘和重写有什么区别?本文
  26. 26Redis 断线后如何通过 PSYNC 部分重同步?
  27. 27Redis 主从切换为什么会丢数据?WAIT 能解决吗?
  28. 28Redis 集群会出现脑裂问题吗?
  29. 29Redisson 看门狗(watch dog)机制了解吗?
  30. 30Redis Cluster:哈希槽、Gossip 与故障转移
  31. 31Redis Pipeline 为什么能提高吞吐?能保证原子性吗?
  32. 32Redis 的 SCAN 和 KEYS 有什么区别?
  33. 33Redis 变慢时如何排查?SLOWLOG 能看到所有耗时吗?
  34. 34Redis 和 MySQL 有什么区别?
  35. 35Redis 为什么使用 SDS,而不是 C 字符串?
  36. 36Redis 的哈希表如何处理冲突和渐进式 rehash?
  37. 37Redis Cluster 的 MOVED 和 ASK 重定向有什么区别?
  38. 38Redis Cluster 为什么会报 CROSSSLOT?Hash Tag 怎么用?
  39. 39Redis 如何实现限流?固定窗口和滑动窗口怎么选?
  40. 40Redis Stream 如何保证消息消费?ACK 和 PEL 是什么?
  41. 41Redis 删除数据后为什么内存不下降?如何理解内存碎片?

AOF 记录恢复数据所需的写操作,刷盘决定日志何时达到持久化要求,重写则缩减历史冗余。刷盘解决可靠性与延迟取舍,重写解决文件体积与恢复成本。 二者不能混为一个过程。

appendfsync 怎么选择?#

策略常见行为取舍
always每次写入后按策略同步 AOF持久性更强,同步成本更高
everysec通常每秒执行同步常用折中,存在近期数据丢失窗口
no不主动按 AOF 策略同步,由 OS 调度可靠性取决于 OS 刷盘行为

写入用户态缓冲、通过 write 进入 OS 缓存、通过 fsync 等同步到底层存储是不同阶段。everysec 常被简记为可能丢一秒数据,但磁盘阻塞和调度会影响实际行为,不能把它当严格的一秒上限。即使 always,也依赖设备和系统正确兑现持久化。

AOF 为什么要重写?#

同一个计数器执行一百万次 INCR,恢复最终状态并不一定要重复一百万次操作。重写根据当前数据集生成更紧凑的恢复表示,同时保留重写期间的新修改;它不是简单去重旧文件中的文本行,因为命令可能存在依赖关系。

Redis 7.0 起采用多文件 AOF 方案,由基础文件、增量文件及 manifest 管理。启用相应配置时,基础部分可以采用 RDB 格式,也就是常说的混合持久化。旧版本单文件重写的缓冲与文件切换描述不能直接套到所有新版本上。

后台重写也可能 fork,因此要考虑 COW、磁盘空间、同步延迟与写入峰值。恢复时要使用完整一致的 AOF 文件集合和 manifest,不能随便挑一个增量文件复制走。

常见追问#

重写期间新的写入会丢吗?#

正常设计会把期间的增量纳入最终持久化文件集合。故障安全仍受刷盘策略和文件管理影响,不能只因为“后台重写”就断言零丢失。

同时有 RDB 和 AOF,启动时用哪个?#

启用 AOF 时通常优先用 AOF 路径恢复,因为它往往更完整;混合格式中的 RDB 基础部分也属于 AOF 恢复集合。

AOF 文件损坏能直接删除坏段吗?#

应先保留备份,再使用对应版本检查工具和恢复流程评估。截断可能丢数据,多文件 AOF 还需检查 manifest,不能凭文本编辑猜测。

AOF 每次刷盘还需要主从复制吗?#

需要视可用性要求决定。AOF服务于本节点恢复,副本服务于其他节点接管;本机磁盘持久化并不自动解决机器整体失效。

Redis 的 AOF 刷盘和重写有什么区别?
https://blog.xqcherry.top/posts/interview/redis/redis-aof-sync-and-rewrite/
作者
xqcherry
发布于
2026-10-12
许可协议
CC BY-NC-SA 4.0