Redis持久化

RDB快照

默认情况下,redis将内存数据持久化到 dump.rdb 二进制文件中。

可以设置redis.conf文件修改 RDB 方式持久化设置,如 save 60 1000 表示在60s内有至少1000个key被改动,触发持久化,保存一次数据。关闭 RDB 只需要将配置文件中所有的 save 和 bgsave方法注释掉就可以了,还可以手动执行save指令或者bgsave指令保存数据,生成新的 RDB 文件,并覆盖老的文件。

save 和 bgsave 的区别:

命令

save

bgsave

io类型

同步

异步

是否阻塞其他redis命令


不会

优点

不需要子进程,就不会额外消耗内存

不会阻塞客户端命令

默认使用的是 bgsave 的方式

AOF方式

快照功能并不能完全保证数据的完整性,假如redis服务器宕机,那就会丢失最近写入,还没来得及同步到RDB文件中的数据,AOF持久话方式会把修改记录的每一条指令都记录到aof文件中(先写入缓存,每隔一段时间fsync同步到磁盘)。

比如执行 set redis learning ,在AOF中是这样记录的。

*3
$3
set
$5
redis
$8
learning

***代表这条指令有几个参数,$**代表这个参数有几个字符

打开AOF功能需要在redis.conf文件中配置

appendonly yes

开启AOF之后,每执行一条set命令,都会将这个命令追加到AOF的末尾,下次redis重启时,就会就会重新执行命令来恢复数据。

可以配置缓存向磁盘同步的策略

appendfsync	always			每次有新命令执行都会同步到磁盘,最安全,但效率最低
appendfsync	everysec		每过一秒同步一次,那么最多丢失一秒的数据,兼顾了效率并且相对安全
appendfsync	no				从不fsync,效率最快,但是最不安全

AOF重写

aof文件中可能有很多多余的命令,比如执行了一下命令

set redis	learningstart
set	redis	learning		执行完这个命令之后,前面那条命令就是多余的

重写会将aof中的命令重新整理,去除掉多余的命令,这样可以让 aof文件 变小,提高恢复数据效率

在redis.conf中配置redis的重写策略

auto-aof-rewrite-min-size	64mb	文件到达64mb之后触发重写,文件太小的话重写意义不大
auto-aof-rewrite-percentage	100		上次重写之后,文件大小增加了100%则再次触发重写,这里就是64mb

AOF对比RDB

持久化方式

RDB

AOF

文件占用空间



数据恢复速度



数据安全性

容易丢数据

配置合适的策略安全性不错

redis启动时,如果既有RDB文件,又有AOF文件,优先选择AOF文件,因为AOF文件一般来说数据更安全

混合持久化方案

重启 redis 时,一般使用数据更安全AOF文件来进行,但是AOF文件相比于RDB文件慢得多,启动花费时间长,所以有了下面这种方案混合持久化。

在redis.conf文件中开启混合持久化

aof-use-rdb-preamble yes

开启混合持久化之后,AOF文件重写时,不在是单纯的重写命令,而是将重写这一刻之前的内存作rdb处理,并将rdb快照内容和新增的命令都存到AOF文件中,覆盖原有的AOF文件。

新的AOF文件既包括二进制的rdb数据,也包括存储指令的aof数据。这样redis重启时,可以先加载rdb的内容,在重新执行rdb后面的指令即可完成数据恢复,效率大大提升。

混合持久话方案兼顾了效率和安全性,选他就可以了。