Table of Contents
一:摘要概述
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
复制代码
评论前必须登录!
注册