我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Redis 持久化中 最核心的原理之一:AOF 的“刷盘机制”

这已经进入 Redis 持久化中 最核心的原理之一:AOF 的“刷盘机制”(也就是日志如何从内存同步到硬盘)了!

 

 


 

 

✅ 什么是 AOF 的“刷盘”?

 

 

所谓 刷盘(fsync),就是:
Redis 把写命令记录到了日志里(AOF 缓冲区)后,把这个日志同步写入到硬盘,以免机器断电时数据丢失。

 


 

 

🧠 为什么要“刷盘”?

 

 

因为磁盘是慢设备,Redis 为了性能,不会每次写命令就立即写入硬盘,而是:

 

  1. 先把写操作追加到 AOF 内存缓冲区(cache)

  2. 根据配置决定什么时候“刷盘”(flush 到 disk)

 

 

如果不刷盘,只存在内存里,Redis 崩了、系统断电,数据就全没了。

 


 

 

✅ AOF 的刷盘策略有三种(非常重要!)

 

 

在 redis.conf 中配置:

appendfsync always
appendfsync everysec
appendfsync no

策略

描述

安全性

性能

always

每一条写操作都立即刷盘(同步写到硬盘)

最安全 ✅

最差 ❌(慢)

everysec

每秒刷一次(默认) —— 1秒数据可能丢失

高 ✅

高 ✅

no

让操作系统自己决定什么时候写(可能好几秒才刷)

最差 ❌

最快 ✅

 

 


 

 

✅ 整个过程示意:

 

 

比如你执行一条命令:

SET user Tom

在 AOF 模式下发生的流程是:

1. Redis 处理这条命令(写入内存)
2. 把 "SET user Tom" 写到 AOF 缓冲区(内存)
3. 根据策略决定何时 fsync 写入硬盘
   - always:马上刷盘 ✅
   - everysec:等 1 秒一起刷 ✅
   - no:由系统决定,时间不确定 ❌

所以,“刷盘”其实就是:

 

把写命令从内存日志 → 刷写到磁盘文件 appendonly.aof 的过程

 


 

 

🔥 面试角度这么说会更加出彩:

 

 

Redis 使用 AOF 持久化时,所有写操作都会被追加写入 AOF 缓冲区,然后由 appendfsync 参数控制刷盘时机。刷盘就是将命令从内存同步到硬盘,确保 Redis 崩溃时仍能通过 AOF 文件恢复数据。

 


 

 

🧠 Bonus 知识点(加分项)

 

 

  • Redis 使用 write() 写入缓冲区,再调用 fsync() 或 fdatasync() 刷盘

  • Redis 主线程处理写请求,AOF 写入 & 刷盘是同步完成的

  • Redis 4.0 后可以结合 RDB 和 AOF 混合持久化(提升启动速度 + 数据安全)

 

 


 

 

✅ 总结一句话:

 

 

Redis AOF 的“刷盘”就是:
将内存中的写命令日志,同步写入磁盘,以防 Redis 崩溃或断电时数据丢失。
是否立即刷盘,由 appendfsync 参数控制,是性能与安全的权衡点!

 


 

如果你想看我模拟一次 Redis 设置不同刷盘策略下的性能差异、故障恢复差异,我可以给你一个实验脚本演示,要不要?😎

posted on 2025-04-21 15:17  我就是奇迹  阅读(123)  评论(0)    收藏  举报