reids主要是两种持久化的方式:RDB和AOF
- RDB(Redis DataBase):RDB保存某一时间点之前的快照数据。
- AOF(Append-Only File):所有的命令行记录以redis请求协议的格式完全持久化存储为aof文件。
- 混合持久化(4.x):指进行AOF重写时,子进程将当前时间点的数据快照保存为RDB文件格式,将父进程累积命令保存为AOF格式。
一、RDB快照
有两种触发方式
1、通过配置参数:
通过一定周期内命令执行的个数,超过阈值即执行快照生成。
save 900 1
save 300 10
save 60 10000
或
save '' #表示关闭RDB快照。注意:主从复制的主节点永远关不掉RDB,配置了也没用。
表示超过多少秒,有多少命令执行,满足则执行快照生成。例如:60秒内超过10000个命令被执行则底层调用bgsave命令生成快照。
2、手动执行bgsave命令或save命令或SHUTDOWN,显式生成快照
save:使用主进程保存,若数据量大可能会造成主进程阻塞。会影响redis服务。
bgsave:fork一个子进程去保存。不会影响redis服务。如图:
RDB持久化优缺点
优点:
- 性能好。使用子进程进行持久化,不影响主进程服务。
- 启动效率高。启动时直接解析RDB二进制文件,比AOF效率高。
缺点:
- 数据安全性低。RDB是隔一段时间进行持久化,如果期间发生故障,数据会丢失。
- RDB持久化期间大量写入操作,产生大量分页错误,内核不断copyonwrite复制异常页,导致性能降低。
二、AOF持久化
#redis.conf配置通过下面配置开启aof,默认是关闭的
appendonly yes
命令执行后,会写入aof缓冲区(在内存中),之后通过某种策略,再写入aof文件
#redis.conf配置同步策略
appendfsync everysec
aof同步策略有三种:
- no 表示等操作系统进行数据缓存同步到磁盘(通常同步周期最长30S)
- always 表示每次更新操作后调用fsync()将数据写到磁盘。非常影响性能,生产环境不能开。
- everysec 每秒同步一次,默认值
AOF重写机制
随着命令不断写入AOF,文件越来越大
有两种触发方式
- 手动触发:bgrewriteaof命令
- 自动触发:auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定触发时机
#redis.conf配置
auto-aof-rewrite-percentage 100 表示当前AOF文件空间和上次重写后的AOF文件空间的比值
auto-aof-rewrite-min-size 64mb #表示AOF文件重写时文件最小体积64MB
AOF优缺点
优点:
- 数据安全。当使用always策略时,可以做到数据0丢失。
缺点:
- 启动效率低。aof文件较大时,启动效率比RDB效率低
三、混合持久化
通过aof-use-rdb-preamble yes配置开启
加载时,首先会识别AOF文件是否以REDIS字符串开头。如果是则按照RDB格式加载,加载完RDB后继续按照AOF格式加载剩余部分。
混合持久化方案兼顾了RDB的速度和AOF的安全性