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的格式追加到文件末尾。