RDB快照(snapshot)




bgsave的写时复制(COW)机制
命令
| save | bgsave |
IO类型 | 同步 | 异步 |
是否阻塞redis其它命令 | 是 |
否(在生成子进程执行调用fork函
数时会有短暂阻塞)
|
复杂度 | O(n) | O(n) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要fork子进程,消耗内存 |
配置自动生成rdb文件后台使用的是bgsave方式。
示例:
假设 BGSAVE
开始时,内存中有键 key1
的值为 A
:
-
子进程开始写入
key1=A
到 RDB 文件。 -
主线程将
key1
修改为B
。 -
Redis 会复制
key1
的内存页,子进程继续写入key1=A
,而主线程使用新的内存页存储key1=B
。 -
写入完成后,用新的 RDB 文件替换旧的 RDB 文件。
由此可以看出:在 Redis 执行 BGSAVE
时,只能保证最终一致性,而不能保证实时一致性。
bgsave是一条命令所以我们可以在连接客户端之后输入bgsave运行
rdb这种持久化方式可能会导致我们丢数据:
-
RDB 是周期性执行的(例如每 5 分钟或 1 小时一次)。
-
如果在上一次快照后 Redis 崩溃,那么从上一次快照到崩溃之间的所有写操作都会丢失。
AOF(append-only file)


从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。
这样的话, 当 Redis 重新启动时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
有三个选项:
1 appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。
2 appendfsync everysec:每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。
3 appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。
推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。


命令 | RDB | AOF |
启动优先级 | 低 | 高 |
体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 容易丢数据 | 根据策略决定 |
Redis 4.0 混合持久化


1. appendonly.aof.1.base.rdb
-
作用:这是 AOF 重写过程中生成的 基础 RDB 文件。
-
生成时机:当 Redis 执行 AOF 重写时,会先创建一个 RDB 文件,保存当前内存中的数据快照。
-
内容:包含 AOF 重写开始时 Redis 内存中的所有数据。
-
特点:
-
文件格式是 RDB 格式,而不是 AOF 格式。
-
作为 AOF 重写的基础数据文件。
-
2. appendonly.aof.1.incr.aof
-
作用:这是 AOF 重写过程中生成的 增量 AOF 文件。
-
生成时机:在 AOF 重写期间,Redis 会继续处理写操作,这些写操作会被记录到增量 AOF 文件中。
-
内容:包含 AOF 重写期间发生的所有写操作。
-
特点:
-
文件格式是 AOF 格式。
-
与基础 RDB 文件(
appendonly.aof.1.base.rdb
)结合,可以完整恢复数据。
-
3. appendonly.aof.manifest
-
作用:这是一个 清单文件,用于管理 AOF 文件的版本和组成。
-
内容:记录了当前 AOF 文件的组成,包括基础 RDB 文件和增量 AOF 文件的名称和顺序。
-
特点:
-
文件格式是文本格式,内容类似于:
plaintext
复制
file appendonly.aof.1.base.rdb seq 1 type b file appendonly.aof.1.incr.aof seq 1 type i
-
Redis 在启动时会读取
manifest
文件,确定需要加载的 AOF 文件。
-
- 这些文件是 Redis 混合持久化机制的体现,结合了 RDB 和 AOF 的优点,既能快速恢复数据,又能保证数据的实时性和完整性。