JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • MYSQL相关

  • REDIS相关

    • Redis 有几种数据结构?Zset 是如何实现的?
    • 为什么 Redis 在单线程下能如此快?
    • 简述 Redis 字符串的底层结构
    • Redis的缓存淘汰策略有哪些?
    • 简述 Redis 持久化中 RDB 以及 AOF 方案的优缺点
      • RDB持久化
      • AOF持久化
    • Redis 如何实现分布式锁?
    • 简述 Redis 集群配置以及基础原理
    • 简述 Redis 中跳表的应用以及优缺点
    • Redis 中,sentinel 和 cluster 的区别和适用场景是什么?
    • 简述 Redis 中如何防止缓存雪崩和缓存击穿
    • 简述 Redis 的线程模型以及底层架构设计
    • 简述 Redis 的哨兵机制
    • 简述 Redis 如何处理热点 key 访问
    • Redis 序列化有哪些方式?
  • 数据库
  • REDIS相关
YoungAnn
2022-05-21
目录

简述 Redis 持久化中 RDB 以及 AOF 方案的优缺点

# RDB持久化

  1. 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
  1. 自动间隔性保存

服务器间隔性检车saveparams中的任意一个条件是否得到满足,如果得到满足,执行bgsave.saveparams[0]表示距离上次bgsave900s内,至少有一次数据库变化。

[外链图片转存中...(img-SwAqAX8z-1653145947293)]

  1. rdb文件结构 [外链图片转存中...(img-Prs54pGE-1653145947294)] 其中database结构如下: [外链图片转存中...(img-rn1gUv6w-1653145947294)] 其中ksy_value_pairs结构如下 [外链图片转存中...(img-B62S2gV5-1653145947295)]

type指定了value的类型。value的编码方式不同期存储结构也不同。

# AOF持久化

  1. aof的实现 命令追加:所有客户端命令都会被存到redis_server的aof_buf缓冲区。 文件写入:操作系统在写入文件的时候,先写入缓存,缓存满了才写入文件。 文件同步:flushAppendOnlyFile()负责将aof_buf写入文件aof。

flushAppendOnlyFile中配置的appendfsync决定同步策略。appendfsync有三个取值:always(每次写入都同步)、everysec(每次事件都写入但不同步,每秒同步)、 no(每次事件都写入但不同步,操作系统决定同步);

  1. aof的载入与还原 [外链图片转存中...(img-pNMyXRLJ-1653145947295)]
  2. AOF重写 [外链图片转存中...(img-i1nhwgNs-1653145947295)]
编辑 (opens new window)
上次更新: 2022/05/22, 00:01:01
Redis的缓存淘汰策略有哪些?
Redis 如何实现分布式锁?

← Redis的缓存淘汰策略有哪些? Redis 如何实现分布式锁?→

最近更新
01
电商-商品系统设计
12-17
02
关于如何写OKR
12-09
03
对事不对人 vs 对人不对事
12-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式