欢迎光临
我们一直在努力

Redis(三) — 浅谈RDB与AOF持久化

一:摘要概述

redis为什么操作速度快?经常被灵魂拷问。虽然说仅仅回答一个内存操作会被嗤之以鼻,但不可否认的是内存的操作肯定是redis速度快的一个主要原因。内存操作数据安全肯定没有数据记录到磁盘那么高,redis针对内存中的数据提供了rdb、aof、rdb/aof混合的三种持久化方式

二:RDB持久化

2.1 持久化内容

rdb持久化内容是某一时刻内存快照。将内存中某一时刻对象信息保存在二进制压缩文件中

2.2 持久化命令

  • save:阻塞主进程
  • bgsave:不阻塞主进程,通过fork子进程方式进行

2.3 持久化策略

redis.conf配置文件218行开始默认提供三个如下策略,满足一个条件就会进行rdb

# 满足下面任何一个条件执行bgsave命令
# 第一个参数表示时间,单位s
# 第二个参数表示修改键数量 
# 当60s内修改1000个键就进行发起bgsave命令执行rdb持久化
# 当300s内修改10个键就进行发起bgsave命令执行rdb持久化
# 当900s内修改1个键就进行发起bgsave命令执行rdb持久化
save 900 1
save 300 10
save 60 10000
复制代码

2.4 持久化源码

策略配置中提到了修改键数量,这个数量记录在redis安装文件src源码目录中的server.h。文件中描述了redisServer结构对象,该结构对象中存在属性dirty描述了redis中距离上次rdb操作后修改的键数量。位置1098行

long long dirty;                /* Changes to DB from the last save */
复制代码

rdb配置的所有策略都会创建为一个数组,每个策略就是一个数组元素。该数组在redisServer中使用saveparam维护,1101行。redis默认策略每过100ms就会轮训检查数组中的策略判断是否执行bgsave。数组元素对象如下所示:

# seconds 配置的秒数
# changes 配置的修改键数量
struct saveparam {
    time_t seconds;
    int changes;
};
复制代码

2.5 配置参数

redis.conf文件中针对rdb持久化提供了不少配置参数,如下所示:

# bgsave策略
save 900 1
save 300 10
save 60 10000
# 当rdb持久化失败时拒绝写操作
stop-writes-on-bgsave-error yes
# rdb文件压缩开启
rdbcompression yes
# rdb文件损坏校验
rdbchecksum yes
# rdb文件名称
dbfilename dump.rdb
# rdb文件目录位置
dir ./
复制代码

三:AOF持久化

3.1 持久化内容

aof持久化内容是增量记录redis写操作的命令,当redis执行数据修改命令时都会将其记录在aof文件中。内存中对象的恢复就可以通过重新执行aof文件恢复

3.2 持久化策略

redis执行的命令在aof开启后会记录一份到aof缓冲区中,缓冲区依然位于内存。将缓冲区内容写入磁盘就是aof持久化,该操作提供如下三个策略:

# always 每次命令执行都会写入磁盘 
# everysec每秒执行一次aof持久化
# no 持久化操作交给操作系统决定是否执行

# appendfsync always
appendfsync everysec
# appendfsync no
复制代码

3.3 配置参数

redis.conf文件中针对aof持久化提供了不少配置参数,如下所示:

# aof默认不开启,打开需要修改以下参数为yes
appendonly yes
# aof文件名称
appendfilename "appendonly.aof"
# aof持久化策略
# appendfsync always
appendfsync everysec
# appendfsync no
复制代码

四:AOF重写

aof持久化很大的缺点就是持久化文件大,比如当一个key写入、删除后aof文件中会记录两条命令,肯定的这两条命令是无效的。为了解决aof持久化文件膨胀问题,redis中提出aof重写即bgrewriteaof

4.1 重写操作

  • 根据redis当前内存快照对象记录命令到新aof文件中,注意aof重写根本不会根据原有aof文件做操作
  • 重写期间执行的写操作命令会记录到重写缓冲区,快照重写完成后会记录到新aof文件中
  • 重写操作fork子进程进行,不会造成主进程阻塞
  • 重写阻塞仅仅发生在重写完成后通知主进程原子替换原有aof文件

4.2 重写策略

redis.conf文件中提供对应策略实现:

# 参数100表示当前aof文件超过上次aof重写后aof文件的2倍
auto-aof-rewrite-percentage 100

# aof文件超过64M进行重写
auto-aof-rewrite-min-size 64mb
复制代码

五:混合持久化

5.1 rdb/aof对比

rdb和aof持久化策略对比有以下各自特点:

持久化策略 保存数据样式 载入速度 文件大小与一致 适用场景
RDB 二进制数据 快,直接解析二进制数据 相对于AOF文件较小,但是数据一致性误差可能较大 做冷数据长期备份
AOF 文本协议命令 慢,依靠伪客户端执行命令 文件随时间臃肿,依靠BGREWRITEAOF瘦身,数据差距就在1s左右的命令 数据完整性高适合做日常持久化维护

5.2 混合持久实现

redis4.0版本中提出了混合持久化的策略,即结合rdb和aof一起做redis的持久化。这样就可以吸取两种持久化策略的优点。实现方式也比较简单,就是在执行aof重写时先做一次rdb快照存储到aof中,然后增量的命令使用命令的方式写入aof。打开混合持久化策略参数如下:

aof-use-rdb-preamble yes
复制代码

转载本站文章请注明,转载自:IT技术资讯 [https://www.ithothub.com]

本文链接:https://www.ithothub.com/redis/2020060417083557.html

赞(0) 打赏

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏