简述 Redis 持久化中 RDB 以及 AOF 方案的优缺点
# RDB持久化
- save和bgsave源码
void saveCommand(redisClient *c) {
// BGSAVE 已经在执行中,不能再执行 SAVE
// 否则将产生竞争条件
if (server.rdb_child_pid != -1) {
addReplyError(c,"Background save already in progress");
return;
}
// 执行
if (rdbSave(server.rdb_filename) == REDIS_OK) {
addReply(c,shared.ok);
} else {
addReply(c,shared.err);
}
}
void bgsaveCommand(redisClient *c) {
// 不能重复执行 BGSAVE
if (server.rdb_child_pid != -1) {
addReplyError(c,"Background save already in progress");
// 不能在 BGREWRITEAOF 正在运行时执行
} else if (server.aof_child_pid != -1) {
addReplyError(c,"Can't BGSAVE while AOF log rewriting is in progress");
// 执行 BGSAVE
} else if (rdbSaveBackground(server.rdb_filename) == REDIS_OK) {
addReplyStatus(c,"Background saving started");
} else {
addReply(c,shared.err);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- 自动间隔性保存
服务器间隔性检车saveparams中的任意一个条件是否得到满足,如果得到满足,执行bgsave.saveparams[0]表示距离上次bgsave900s内,至少有一次数据库变化。
[外链图片转存中...(img-SwAqAX8z-1653145947293)]
- rdb文件结构 [外链图片转存中...(img-Prs54pGE-1653145947294)] 其中database结构如下: [外链图片转存中...(img-rn1gUv6w-1653145947294)] 其中ksy_value_pairs结构如下 [外链图片转存中...(img-B62S2gV5-1653145947295)]
type指定了value的类型。value的编码方式不同期存储结构也不同。
# AOF持久化
- aof的实现 命令追加:所有客户端命令都会被存到redis_server的aof_buf缓冲区。 文件写入:操作系统在写入文件的时候,先写入缓存,缓存满了才写入文件。 文件同步:flushAppendOnlyFile()负责将aof_buf写入文件aof。
flushAppendOnlyFile中配置的appendfsync决定同步策略。appendfsync有三个取值:always(每次写入都同步)、everysec(每次事件都写入但不同步,每秒同步)、 no(每次事件都写入但不同步,操作系统决定同步);
- aof的载入与还原 [外链图片转存中...(img-pNMyXRLJ-1653145947295)]
- AOF重写 [外链图片转存中...(img-i1nhwgNs-1653145947295)]
编辑 (opens new window)
上次更新: 2022/05/22, 00:01:01