Redis持久化

我们都知道Redis是一个内存数据库,因为数据都存在于内存中,所以当发生机器断电、服务宕机等问题时数据会丢失,为了防止全部数据丢失,Redis提出了持久化策略。所谓持久化就是将内存中数据同步到磁盘,就算是机器断电、服务宕机,重启后至少还可以通过将磁盘数据加载到内存继续对外提供服务。Redis持久化策略有两种:一是RDB(Redis DataBase);二是AOF(Append Only File)。

一、RDB持久化

对于Redis持久化来说,其实就是将存储在内存中的数据写入磁盘防止大批量数据丢失,只不过写入的方式不同罢了。

1、什么是RDB持久化

RDB持久化就是我们平时常听到的快照持久化。所谓快照就是指某一时刻内存中的数据,而持久化是将这一时刻内存中的数据以二进制的形式写入磁盘。RDB持久化在Redis内部是定时触发的,也可以手动触发。

2、手动触发

Redis持久化提供save和bgsave两个指令可以用来手动触发RDB持久化策略

(1)、save指令

Redis处理命令的方式是以单线程形式来进行的,客户端的请求会被放在一个队列中,当其中一个客户端发起save请求时,如果该请求执行耗时比较长的话,那么在这一段时间内Redis都不能对外提供服务(后面的请求加入队列就都被阻塞了,一旦队列满了之后就会拒绝新的请求),所以不建议使用save指令进行手动触发RDB持久化。

(2)、bgsave指令

 

 bgsave指令与save指令的区别在于写入磁盘是通过fork出的子进程实现的,所以不会阻塞其他客户端请求,其他请求还是由主进程处理。

3、自动触发

RDB自动触发是通过redis.conf文件中的save m n配置实现的。其中m代表秒数,n代表次数,意思是m秒内发生n次变化时,会触发bgsave。

redis.conf文件中有三个默认配置项:

save 900 1  -->表示900秒内,Redis中数据至少发生1次变化就会触发bgsave

save 300 10  -->表示300秒内,Redis中数据至少发生10次变化就会触发bgsave

save 60 10000  -->表示60秒内,Redis中数据至少发生10000次变化就会触发bgsave

那这三个该执行哪一个呢?答案是设置多个save m n配置时,满足任何一个条件都会触发bgsave。

4、RDB数据恢复

持久化的目的就是在需要的时候进行数据恢复,在Redis服务重启的时候负责将数据从磁盘RDB文件加载到内存。

 开启自动持久化后,数据会存储到磁盘名为dump.rdb文件中,当Redis服务器重启时,检测到dump.rdb文件后,会自动加载进行数据恢复。

二、AOF持久化

1、什么是AOF持久化

AOF持久化是一种使数据产生变化的指令追加的持久化方式。与RDB不同的是,它是通过保存所执行的写指令来实现的,并且保存的数据格式是客户端发送的指令。

2、AOF实现方式

想要使用AOF持久化方式,需要启用redis.conf配置文件中的appendonly参数。默认情况下Redis的持久化策略是RDB。

appendonly yes

开启AOF持久化后每执行一条写指令(会使数据发生变化的指令),Redis就会将该指令写入aof_buf缓冲区,后续写入AOF文件中的操作是由下面配置来实现的:

appendfsync always  -->每次写入都进行刷盘操作,对性能影响较大,占用磁盘IO较高,数据安全性最高

appendfsync everysec  -->1秒刷盘一次,对性能影响较小

appendfsync no  -->按照操作系统的机制进行刷盘,对性能影响最小,数据安全性最低

3、AOF重写机制

随着客户端写请求的增多,AOF文件中存储的写指令也越来越多,为了防止AOF文件越来越庞大,Redis提供了重写机制。

Redis配置文件中以下两个配置决定重写机制的触发时机:

auto-aof-rewrite-percentage 100  -->AOF文件距离上次文件增长超过多少百分比触发重写机制

auto-aof-rewrite-min-size 64mb  -->AOF文件大小超过超过最小容量触发重写机制

满足其中任何一个条件时,会自动触发AOF重写机制,此时Redis会扫描所有数据,重新生成一个AOF文件来达到AOF文件瘦身的效果。

4、AOF文件恢复

 相比于RDB存储的是数据,AOF的恢复就需要创建一个伪客户端去顺序执行AOF文件中的每一条指令。

如果开启了AOF持久化功能,会优先使用AOF文件来进行恢复。只有在AOF关闭状态下,才会使用RDB文件进行数据恢复。

三、RDB和AOF的优缺点

1、RDB的优缺点

(1)、优点

文件体积小:RDB的文件内容是二进制格式,因此体积比实际内存小。

恢复速度快:当Redis实例恢复时,加载RDB文件速度很快,能在很短时间内迅速恢复数据。

(2)、缺点

数据缺失:RDB保存的是某一时刻的数据,当Redis实例在上一次持久化和下一次持久化之间异常时,会丢失部分数据(上一次持久化到此刻Redis实例异常之间的数据)。

消耗资源:RDB文件的生成会消耗大量的CPU和内存资源。

2、AOF的优缺点

(1)、优点

数据更完整:AOF是实时写入的方式,数据保存更完整,恢复时降低数据的损失率。

可读性强:AOF文件中保存的数据格式是客户端的写指令,可读性更强一些。

(2)、缺点

文件体积大:AOF中存储客户端所有的写指令,未经过压缩,随着客户端写请求的增多,AOF文件会越来越大。

增加磁盘IO:为了保证数据的安全性,AOF文件刷盘不管是实时刷盘还是1秒刷盘一次,磁盘IO都比较高,影响性能。

四、混合持久化

RDB和AOF都有各自优缺点,但我们会发现它们两个的优缺点基本都是互补的,能不能采用它们的混合模式进行持久化呢?

在Redis4版本之后新增了混合式持久化。

1、持久化方式

混合持久化是通过aof-use-rdb-preamble参数来开启的。在写入的时候先把数据以RDB的形式写入文件的开头,再讲后续的写指令以AOF的方式追加到文件中。这样既能保证数据恢复时的速度,同时又能减少数据丢失的风险。

2、文件恢复方式

在Redis重启时,先加载RDB的内容,然后再重放增量AOF指令。这样就避免了AOF持久化时的全量加载,从而大幅度提升数据恢复的速度。

五、总结

1、RDB持久化

  • 将某一时刻的数据以二进制形式写入到磁盘里,服务重启时检测到dump.rdb文件自动加载进行数据恢复。
  • 有手动触发和自动触发两种机制。

2、AOF持久化

  • 以文件追加的方式写入客户端执行的写指令。
  • 数据恢复时,通过创建伪客户端执行AOF文件中的指令进行数据恢复。

3、混合持久化

  • 在写入的时候先把数据以RDB的形式写入文件开头,再将后续的写指令以AOF的格式追加到文件末尾。

 

posted @ 2020-12-05 16:41  西北-孤狼  阅读(142)  评论(0)    收藏  举报