0


大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (正在更新…)

章节内容

上节完成了的内容如下:

  • Redis 持久化原因
  • Redis 持久化机制 RDB AOF
  • 基础概念、适用场景等

在这里插入图片描述

RDB

RDB(Redis DataBase),是Redis的默认存储方式,RDB是通过快照的方式(snapshotting)完成的。

触发方式

  • 符合自定义配置的快照规则
  • 执行 save 或 bgsave 命令
  • 执行 flushall 命令
  • 执行主从复制操作(第一次)

配置参数

redis.conf

中配置:save

save ""# 不使用RDB存储
save 9001# 900秒(15分钟)至少1个键修改则保存
save 30010# 300秒(5分钟)至少10个键修改则保存

显式触发

bgsave

执行流程

在这里插入图片描述

  • Redis 父进程判断:当前是否在执行 Save、bgsave、bgrewriteaof等等指令的子进程,如果在执行则bgsave命令直接返回
  • 父进程执行fork操作创建子进程,这个过程中父进程是要进行阻塞的,Redis此时不能执行来自客户端的任何命令
  • 父进程fork后,bgsave命令返回 “Background saving started”信息并不再阻塞父进程,并可以响应其他命令。
  • 子进程创建RDB文件,根据父进程内存快照生成临时文件,完成对原有文件进行原子替换
  • 子进程发送信号父进程表示完成,父进程更新统计信息。
  • 父进程Fork结束后,继续工作。

文件结构

在这里插入图片描述

  • 头部 5字节固定位 REDIS
  • 4字节 RDB 版本号
  • 辅助字段 以 KEY-VALUE
  • 存储数据库号码
  • 字典大小
  • 过期 KEY
  • 主要数据 以 KEY-VALUE
  • 结束标志
  • 校验和,看文件是否存坏,是否被修改

RDB优点

  • RDB是二进制压缩文件,占用空间小,便于传输
  • 主进程Fork子进程,可以最大化Redis性能,主进程不能够太大,否则会导致阻塞

RDB缺点

  • 不保证数据的完整性,会丢失最后一次快照以后的数据

AOF

AOF(append only file)是Redis的另一种持久化方式,

Redis默认

情况下是

不开启

的。
Redis 将

所有对数据库

进行

写入命令

记录到

AOF文件

中,这样

Redis 重启

后按

顺序执行

这些指令即可恢复。

AOF 会记录过程,RDB 是保存结果。

配置参数

同样,我们修改

redis.conf
# 参数开启 AOF
appendonly yes# AOF的位置dir ./
# 默认文件名
appendfilename appendonly.conf

具体原理

AOF 文件中存储的 Redis 的指令,具体过程有三个阶段:

  • 命令传播:Redis 将执行完的命令、参数等发送到 AOF 程序中
  • 缓存追加:AOF 程序根据接收到的命令数据,将命令转换为网络通讯协议格式,再追加到服务器的AOF缓存中。
  • 文件写入保存: AOF 缓存中的内容会被写入到 AOF 文件末尾,如果设定的AOF保存条件被满足的话,fsync函数或者fdatasync函数会被调用,写入的内容被真正的保存到磁盘中

保存方式

可以配置保存的方式如下:

  • AOF_FSYNC_NO 不保存
  • AOF_FSYNC_EVERYSEC 每一秒钟保存一次 (默认)
  • AOF_FSYNC_ALWAYS 每一个指令保存一次

在这里插入图片描述

AOF 瘦身

平常会遇到如下的场景

set name wzk
set name kangkang # 此时 保存 set name wzk 是没有意义的set age 13

或者是这种场景

lpush list 123
lpush list 456# 这种优化完可以变成: lpush 1 2 3 4 5 6

Redis 不希望 AOF 重写造成服务器无法处理请求,所以 Redis 决定将 AOF 重写程序放入到后台中:

  • 子进程AOF重写期间,主进程可以继续处理请求
  • 子进程带有主进程的发数据副本,使用子进程
不过使用子进程也有一个问题:

因为子进程在进行

AOF重写期间

,主进程还需要继续处理命令,而

新的命令

可能会对

现有的数据进行修改

,这会让

当前数据库

的数据和

重写后

的AOF文件中的数据

不一致

为了解决不一致的问题

,Redis 加了一个 AOF 缓存,这个缓存在Fork出子进程之后,Redis主进程接收到新的写命令时,除了会将这个命令追加到现有的AOF文件,还会

追加

到这个缓存中。

具体的逻辑图如下:
在这里插入图片描述

触发方式

可以修改

redis.conf
# 表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以启动时aof文件大小为准
auto-aof-rewrite-percentage 100# 限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
auto-aof-rewrite-min-size 64mb

显式触发

bgrewriteaof

持久化混合

RDB 和 AOF 各有优缺点

Redis 4.0

版本之后开始支持

RDB + AOF

混合的模式。
如果在混合模式下,AOF rewrite时就直接把 RDB的内容写到 AOF 的开头。
如果要开启 混合模式 修改 redis.conf

aof-use-rdb-preamble yes

本文转载自: https://blog.csdn.net/w776341482/article/details/140653155
版权归原作者 武子康 所有, 如有侵权,请联系我们删除。

“大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点”的评论:

还没有评论