一、Redis 持久化是什么?
Redis 是一个基于内存的数据库,数据主要存放在内存中。
内存的特点是读写速度快,但是一旦服务器重启、Redis 进程异常退出,内存中的数据就可能丢失。
为了解决这个问题,Redis 提供了持久化机制,可以把内存中的数据保存到磁盘上。
Redis 常见的持久化方式主要有两种:
- RDB
- AOF
它们的目的都是防止 Redis 重启后数据全部丢失,但是实现方式不一样。
二、RDB 是什么?
RDB,全称是 Redis Database。
它的核心思想是:在某一个时间点,把 Redis 内存中的数据整体保存成一个快照文件。
可以简单理解为:
RDB 就是定期给 Redis 内存拍一张照片。
比如 Redis 当前有这些数据:
name = 张三
age = 18
count = 100
Redis 会在某个时间点,把这些数据保存到一个 RDB 文件中。
当 Redis 重启时,就可以读取这个 RDB 文件,把数据恢复到内存中。
三、AOF 是什么?
AOF,全称是 Append Only File。
它的核心思想不是保存某一刻的完整数据,而是把 Redis 执行过的写命令记录下来。
可以简单理解为:
AOF 就是把每一次修改 Redis 数据的命令都记到日志里。
比如执行了下面这些命令:
SET name 张三
SET age 18
INCR count
AOF 文件中就会记录这些写命令。
当 Redis 重启时,会重新执行 AOF 文件中的命令,从而把数据恢复出来。
四、RDB 和 AOF 的核心区别
| 对比项 | RDB | AOF |
|---|---|---|
| 保存方式 | 保存某一时刻的数据快照 | 保存每一次写操作命令 |
| 文件内容 | 二进制快照文件 | Redis 写命令日志 |
| 恢复速度 | 较快 | 相对较慢 |
| 数据安全性 | 可能丢失最近一段时间的数据 | 数据丢失更少 |
| 文件体积 | 通常较小 | 通常较大 |
| 性能影响 | 相对较小 | 略大一些 |
| 适合场景 | 备份、快速恢复 | 对数据安全要求较高的场景 |
五、RDB 的数据恢复过程
假设 Redis 配置了每 5 分钟生成一次 RDB 快照。
时间线如下:
10:00 生成 RDB 快照
10:01 写入数据 A
10:02 写入数据 B
10:03 Redis 宕机
Redis 重启之后,只能根据 10:00 生成的 RDB 文件进行恢复。
也就是说,10:01 到 10:03 之间写入的数据,可能会丢失。
所以 RDB 最大的问题就是:如果 Redis 还没来得及生成新的快照就宕机了,那么最近一段时间的数据可能无法恢复。
六、AOF 的数据恢复过程
AOF 是通过记录写命令来恢复数据的。
比如执行了下面这些命令:
SET name 张三
SET age 18
INCR count
AOF 文件会把这些写命令追加保存下来。
Redis 重启时,会从头到尾重新执行这些命令,最终恢复出宕机前的数据状态。
AOF 常见的刷盘策略有三种:
appendfsync always
appendfsync everysec
appendfsync no
其中最常用的是:
appendfsync everysec
这个配置表示每秒把 AOF 日志同步到磁盘一次。
这种方式在性能和数据安全之间做了一个比较好的平衡。正常情况下,即使 Redis 宕机,也最多丢失最近 1 秒左右的数据。
七、RDB 的优缺点
1、RDB 的优点
- RDB 文件通常比较小,适合做备份。
- Redis 重启恢复速度比较快。
- 对 Redis 正常读写性能影响相对较小。
2、RDB 的缺点
- 可能会丢失最近一段时间的数据。
- 如果数据量很大,生成快照时也会产生一定的资源消耗。
八、AOF 的优缺点
1、AOF 的优点
- 数据安全性更高。
- 可以做到最多只丢失最近 1 秒左右的数据。
- AOF 文件是命令日志,可读性比 RDB 更强。
2、AOF 的缺点
- AOF 文件通常比 RDB 文件更大。
- Redis 重启时需要重新执行命令,恢复速度可能比 RDB 慢。
- 每次写操作都要追加日志,对性能有一定影响。
九、AOF 文件会不会越来越大?
AOF 文件会随着写命令越来越多而不断变大。
比如多次修改同一个 key:
SET name 张三
SET name 李四
SET name 王五
实际上,Redis 最终只需要保留最后的结果:
SET name 王五
但是在没有处理之前,AOF 文件中可能会记录多条历史命令。
为了解决这个问题,Redis 提供了 AOF 重写机制。
AOF 重写并不是简单地压缩原来的 AOF 文件,而是根据 Redis 当前内存中的数据状态,重新生成一份更简洁的 AOF 文件。
比如原来有三条命令:
SET name 张三
SET name 李四
SET name 王五
重写之后可能只保留一条:
SET name 王五
这样 AOF 文件就会变小,Redis 重启恢复时执行的命令也会减少。
十、总结
RDB 和 AOF 都是 Redis 的持久化方式。
RDB 是定期生成数据快照,优点是文件小、恢复快,缺点是可能丢失最近一段时间的数据。
AOF 是记录每一次写命令,优点是数据更安全,缺点是文件大、恢复相对慢一些。

Comments NOTHING