Redis持久化

226 阅读3分钟

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快照期间新写入的命令合并成一个新的文件,等待新的文件重写完毕之后在原子替换掉原文件.