RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响 Redis 的启动速度,为了能同时使用 RDB 和 AOF 各种的优点,Redis 4.0 之后新增了混合持久化的方式

前言

Redis提供两种持久化机制RDB(Redis Database Backup)和 AOF(Append-Only File)机制:
RDB(默认的) 持久机制是对Redis中的数据执周期性的持久化 (适合备份和恢复大量数据)
AOF 持久机制是对Redis中的所有执行的命令记录持久化(适合持续更新和变化的数据)

在实际开发中:
如果数据量较小,写入频率低,对数据一致性不要求,建议使用RDB方式
如果数据量较大,写入频率高,对数据一致性要求较高,建议使用AOF方式

RDB

RDB是将Redis的内存中的数据定期保存到磁盘上,以防止数据在Redis进程异常退出或服务器断电等情况下丢失

RDB 分为手动触发自动触发save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

手动触发:使Redis处于阻塞状态,直到RDB持久化完成,生产环境慎用
1、save命令:使Redis处于阻塞状态,直到RDB持久化完成,生产慎用
2、bgsave命令:fork出一个子进程执行持久化,主进程只在fork过程中有短暂的阻塞,子进程创建之后,主进程就可以响应客户端请求了 (如果数据集比较大的话,可能会导致服务暂停几百毫秒,甚至1秒钟,会占用CPU资源)

自动触发:

1、主从同步:全量同步会自动触发bgsave命令,生成RDB发送给从节点
2、save m n :在m秒内,如果有n个键发生改变,就自动触发持久化,通过bgsave执行

save 900 1:表示900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10:表示300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000:表示60 秒内如果至少有 10000 个 key 的值变化,则保存

RDB的优点是:快照文件小、恢复速度快,适合做备份和灾难恢复
RDB的缺点是:定期更新可能会丢数据

AOF

AOF是将Redis的所有写操作追加到AOF文件的末尾,从而记录了Redis服务器运行期间所有修改操作的详细记录。当Redis重新启动时,可以通过执行AOF文件中保存的写操作来恢复数据

配置:

# AOF默认是关闭的需要手动开启
appendonly yes

# AOF文件名称
appendfilename "appendonly.aof"

# 回写策略
appendfsync always

# 触发重写的条件 (这两个条件同时满足才会触发重写)

# 当现有aof文件比上次大100%则触发重写
auto-aof-rewrite-percentage 100
# 当现有文件大于64兆的时候就触发重写
auto-aof-rewrite-min-size 64mb

注意: 重启redis不要使用kill进程的方法,这样会导致redis当前数据无法写入AOF或RDB
使用客户端的命令:shutdown来安全关闭redis

AOF回写策略:

appendfsync always: 每个写命令执行完成,会立马将命令刷新到磁盘中
appendfsync everysec: 每秒同步,异步操作,如果一秒内宕机,有可能会造成数据丢失
appendfsync no: 每个写命令执行完成,由操作系统控制决定何时刷到磁盘

AOF的优点是:可以实现更高的数据可靠性、支持更细粒度的数据恢复,适合做数据存档和数据备份
AOF的缺点是:文件大占用空间更多,每次写操作都需要写磁盘导致负载较高

混合持久化

Redis4.0以后推出了 RDB-AOF 混合持久化,它结合了RDB和AOF持久化的优点,开头为RDB的格式,使得Redis可以快速启动,同时结合 AOF的优点,可以有效的降低数据丢失的风险(Redis5.0默认值为 yes)

混合持久化的数据存储结构如下图所示:

配置:

# 查询是否开启了混合持久化
config get aof-use-rdb-preamble
# 开启
config set aof-use-rdb-preamble yes
# 通过修改 Redis 配置文件开启
aof-use-rdb-preamble yes

注意:如果开启混合持久化,那么此混合持久化 AOF 文件,是不能用在旧版本中的,不向下兼容的

混合持久化结合了 RDB 和 AOF 持久化的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合 AOF 的优点,又降低了大量数据丢失的风险