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

一:摘要概述

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

二: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行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;
};
复制代码

2.5 配置参数

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持久化

3.1 持久化内容

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

3.2 持久化策略

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

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

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

3.3 配置参数

redis.conf文件中针对aof持久化提供了很多配置参数,以下所示:server

# 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
复制代码
相关文章
相关标签/搜索