Redis持久化
1. RDB快照(snapshot)
在默认情况下,Redis将内存数据库快照保存在dump.rdb的二进制文件中.
1.1 保存策略
- 自动保存
save 60 1000 //60秒内有1000次改动
save 10 200 //10秒内有200次改动
- 手动保存:在Redis客户端执行save或者bgsave可以手动生成dump.rdb文件,新文件会覆盖掉原文件
1.2 save与bgsave的区别
| 命令 | sava | bgsave |
|---|---|---|
| IO类型 | 同步 | 异步 |
| 是否阻塞命令 | 是 | 否(使用fork函数生成子进程是会有短暂阻塞) |
| 时间复杂度 | O(n) | O(n) |
| 优点 | 不会消耗额外内存 | 不会阻塞客户端命令 |
| 缺点 | 阻塞客户端命令 | 消耗额外内存 |
配置文件自动生成dump.rdb的默认策略是bgsave
1.3 禁用RDB
只需要将配置文件中所有的save策略删除或者注释即可
2. AOF (append-only file)
快照功能容易发生最近写入的数据丢失的问题,从1.1版本开始,Redis增加了一种完全耐久的持久化方式,AOF持久化,它会将每一条执行的指令都写入文件appendonly.aof中
2.1 开启AOF
/*在配置文件中加入*/
appendonly yes
从现在开始,每次执行一个改变数据的命令时,这个命令都会被追加到AOF中
2.2 AOF持久化策略
AOF持久化策略有三种
- appendfsync always:每次有新命令都会追加一次,耗时且安全
- appendfsync everysec:每秒追加一次,速度快,故障时只会丢失1S的数据
- appendfsync no:从不同步,将数据交给操作系统处理,速度最快,安全性最低 折中考虑,推荐每秒追加一次的方案
2.3 AOF重写
AOF中可能存在很多没有用的指令,所以AOF会定期根据内存的最新数据重新生成aof文件
- 例1.连续的set操作,重写后只保留最后一条
- 例2.连续的incr,重写后变为set key incr次数
2.4 aof文件格式
/*set readcount 5*/
*3 //命令中几个单词
$3 //第一个单词长度
set //第一个单词
$9 //第二个单词长度
readcount //第二个单词
$1 //第三个单词长度
5 //第三个单词
2.5 AOF重写频率
可以通过以下配置设置
- auto-aof-rewrite-min-size 64mb: aof达到64M后自动重写
- auto-aof-rewrite-percentage 100: aof文件自上一次重写后增长了100%则再次重写
- 执行bgrewriteaof: 手动重写(会fork出一个子进程)
3 AOF与RDB对比
| 命令 | AOF | RDB |
|---|---|---|
| 启动优先级 | 高 | 低 |
| 体积 | 大 | 小 |
| 恢复速度 | 慢 | 快 |
| 安全性 | 根据策略决定 | 容易丢数据 |
4 混合持久化
在Redis4.0版本后支持,默认关闭
重启Redis时,我们很少使用RDB恢复内存状态,因为可能会丢失大量数据.我们通常会使用AOF方式恢复数据,但是aof方式的性能要比RDB差上不少,在Redis实例很大的情况下,启动要花费较长时间,因此混合持久化应时而生
4.1 开启混合持久化
aof-use-rdb-preamble yes
4.2 混合持久化过程
在aof重写时,会将重写这一刻之前的命令做RDB快照处理,将RDB后的二进制内容,与生成RDB快照期间新写入的命令合并成一个新的文件,等待新的文件重写完毕之后在原子替换掉原文件.