redis为何操做速度快?常常被灵魂拷问。虽说仅仅回答一个内存操做会被嗤之以鼻,但不能否认的是内存的操做确定是redis速度快的一个主要缘由。内存操做数据安全确定没有数据记录到磁盘那么高,redis针对内存中的数据提供了rdb、aof、rdb/aof混合的三种持久化方式redis
rdb持久化内容是某一时刻内存快照。将内存中某一时刻对象信息保存在二进制压缩文件中数组
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
复制代码
策略配置中提到了修改键数量,这个数量记录在redis安装文件src源码目录中的server.h。文件中描述了redisServer结构对象,该结构对象中存在属性dirty描述了redis中距离上次rdb操做后修改的键数量。位置1098行bash
long long dirty; /* Changes to DB from the last save */
复制代码
rdb配置的全部策略都会建立为一个数组,每一个策略就是一个数组元素。该数组在redisServer中使用saveparam维护,1101行。redis默认策略每过100ms就会轮训检查数组中的策略判断是否执行bgsave。数组元素对象以下所示:app
# seconds 配置的秒数
# changes 配置的修改键数量
struct saveparam {
time_t seconds;
int changes;
};
复制代码
redis.conf文件中针对rdb持久化提供了很多配置参数,以下所示:spa
# 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持久化内容是增量记录redis写操做的命令,当redis执行数据修改命令时都会将其记录在aof文件中。内存中对象的恢复就能够经过从新执行aof文件恢复操作系统
redis执行的命令在aof开启后会记录一份到aof缓冲区中,缓冲区依然位于内存。将缓冲区内容写入磁盘就是aof持久化,该操做提供以下三个策略:code
# always 每次命令执行都会写入磁盘
# everysec每秒执行一次aof持久化
# no 持久化操做交给操做系统决定是否执行
# appendfsync always
appendfsync everysec
# appendfsync no
复制代码
redis.conf文件中针对aof持久化提供了很多配置参数,以下所示:server
# aof默认不开启,打开须要修改如下参数为yes
appendonly yes
# aof文件名称
appendfilename "appendonly.aof"
# aof持久化策略
# appendfsync always
appendfsync everysec
# appendfsync no
复制代码
aof持久化很大的缺点就是持久化文件大,好比当一个key写入、删除后aof文件中会记录两条命令,确定的这两条命令是无效的。为了解决aof持久化文件膨胀问题,redis中提出aof重写即bgrewriteaof对象
redis.conf文件中提供对应策略实现:
# 参数100表示当前aof文件超过上次aof重写后aof文件的2倍
auto-aof-rewrite-percentage 100
# aof文件超过64M进行重写
auto-aof-rewrite-min-size 64mb
复制代码
rdb和aof持久化策略对比有如下各自特色:
持久化策略 | 保存数据样式 | 载入速度 | 文件大小与一致 | 适用场景 |
---|---|---|---|---|
RDB | 二进制数据 | 快,直接解析二进制数据 | 相对于AOF文件较小,可是数据一致性偏差可能较大 | 作冷数据长期备份 |
AOF | 文本协议命令 | 慢,依靠伪客户端执行命令 | 文件随时间臃肿,依靠BGREWRITEAOF瘦身,数据差距就在1s左右的命令 | 数据完整性高适合作平常持久化维护 |
redis4.0版本中提出了混合持久化的策略,即结合rdb和aof一块儿作redis的持久化。这样就能够吸收两种持久化策略的优势。实现方式也比较简单,就是在执行aof重写时先作一次rdb快照存储到aof中,而后增量的命令使用命令的方式写入aof。打开混合持久化策略参数以下:
aof-use-rdb-preamble yes
复制代码