在这里插入图片描述
Redis 是一个天才,也是一个“健忘症患者”。

它把所有数据都存在内存里,所以跑得飞快(每秒读写 10 万次)。
但它有一个致命弱点:一旦断电,内存里的数据就会瞬间蒸发,归零。

为了治好这个健忘症,Redis 必须要学会把脑子里的东西记在硬盘上。这就是 持久化 (Persistence)

Redis 提供了两种截然不同的“记性训练法”:RDB (快照)AOF (日志)


📸 一、RDB (Redis DataBase):定期拍照的摄影师

1. 核心原理:快照 (Snapshot)

RDB 就像是给数据库 “拍全家福”
你可以配置:“每隔 1 小时,或者每修改 1000 次数据,就拍一张照片。”

当触发拍照时,Redis 会把那一瞬间内存里所有的数据,打包生成一个压缩的二进制文件(dump.rdb),保存在硬盘上。

2. 关键技术:Fork 与 Copy-on-Write (写时复制)

你可能会问:“拍照(保存磁盘)的时候,Redis 还能处理新的请求吗?会不会卡死?”

这就是 Redis 聪明的地方。它利用了操作系统的 Fork 机制:

  1. 分身: Redis 主进程(父进程)突然“分身”,克隆出一个一模一样的子进程
  2. 各司其职:
  • 父进程: 继续负责接待客户(处理读写请求)。
  • 子进程: 负责在那儿安安静静地把内存数据写到硬盘上。
  1. Copy-on-Write:
  • 如果父进程在拍照期间修改了数据(比如把 Key1 从 A 改成了 B),操作系统会把 Key1 所在的内存页复制一份给父进程改。
  • 子进程看到的依然是拍照那一瞬间的旧数据 A。
  • 结论: 这一张照片,绝对是时间静止的完美快照。

3. 优缺点

  • 优点: 恢复速度极快!因为它是压缩过的最终结果,Redis 重启时直接读进内存就行。
  • 缺点: 容易丢数据。如果你每小时拍一次照,在第 59 分钟断电了,那你这 59 分钟的数据全没了。

📝 二、AOF (Append Only File):事无巨细的记账员

1. 核心原理:追加日志 (Log)

AOF 就像是 “写日记”
它不存数据本身,而是记录所有的写操作命令

  • 你执行 SET name "Redis",AOF 文件里就追加一行:SET name "Redis"
  • 你执行 DEL age,AOF 文件里就追加一行:DEL age

2. 关键策略:fsync

写日记也是要花时间的。Redis 提供了三种写日记的频率:

  • Always: 每执行一条命令,立马写硬盘。最安全,但最慢(性能堪忧)。
  • Everysec (默认): 每秒钟写一次硬盘。性价比最高。最多只丢 1 秒的数据。
  • No: 看操作系统心情。

3. AOF 重写 (Rewrite):日记瘦身

如果 Redis 运行了很久,日记本会变得超级厚(文件巨大)。
比如你对 count 加了 100 次 1,日志里就有 100 行 INCR count

Redis 会定期进行 Rewrite(重写)
它看一眼现在的内存,发现 count 等于 100。
于是它把日志里的 100 行废话删掉,只写一行:SET count 100
日记本瞬间变薄了。

4. 优缺点

  • 优点: 数据最安全。配置得当,最多只丢 1 秒数据。
  • 缺点: 文件大,恢复慢。重启时,Redis 要把日记本里的命令从头到尾再执行一遍,这比读 RDB 文件慢多了。

🥊 三、巅峰对决:该选谁?

维度 RDB (快照) AOF (日志)
文件大小 (二进制压缩) (文本命令)
恢复速度 极快 (需回放命令)
数据安全性 (丢一段时间) (最多丢 1 秒)
系统影响 Fork 时瞬间阻塞 持续占用一点 I/O
比喻 照片 日记本

🎯 四、总结:成年人不做选择题

在 Redis 4.0 之前,我们还在争论用 RDB 还是 AOF。
但在现代,最佳实践是 “混合持久化” (Hybrid Persistence)

结合两者的优点

  1. 前半段用 RDB 格式存(由于是压缩的,恢复快)。
  2. 最近发生的增量数据用 AOF 格式存(保证不丢数据)。

结论

  • 如果你只拿 Redis 做缓存(丢了也没事,哪怕从数据库重新加载),可以关掉持久化,性能起飞。
  • 如果你拿 Redis 当数据库用(不能丢数据),请务必开启 RDB + AOF 混合模式
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐