作为内存数据库,Redis读写速度是无可挑剔的,但对内存来说,断电或遇到故障后数据就会丢失,基于此,Redis提供了两种持久化方案,如下:
⼀、RDB持久化
Redis持久化本质是以不同的策略将内存中的数据写到磁盘,大体过程简述如下:
1、RDB持久化含义
英文名称是Redis Data Base,也叫快照持久化。快照,在这是指某时刻的内存数据,而持久化则是将这⼀时刻的数据以⼆进制形式写⼊到磁盘⾥。
2、⼿动触发机制
(1)save命令
在客户端操作命令就可以将内存数据写⼊到磁盘里。
我们了解,Redis处理命令的方式是以单线程形式来进行的,客户端的请求都会放⼊⼀个队列⾥,当执⾏save命令时,如执⾏时间过长,后续请求就会被阻塞,其他命令都会被拒绝,生产环境切记别这么玩儿,否则就是自己送自己一首凉凉。
(2)bgsave命令
与save不同的是,它执行过程中不会阻塞客户端的请求,是将持久化⼯作交给⼦进程来执⾏,主进程仍负责客户端请求的处理⼯作。
3、⾃动触发机制
⾃动触发通常是Redis中配置⽂件来执⾏的,如下:
save m n
m为秒数,n为次数,可理解为m秒内发⽣n次变化时,会触发bgsave。
再来看Redis配置⽂件redis.conf中的三个默认配置项:
save 900 1意思是时间900秒内,如果Redis中数据⾄少发⽣⼀次变化,就会执⾏bgsave。后边两个意思差不多一样。
当我们设置多个【save m n】命令时,满⾜任何⼀个条件都会触发持久化。
4、RDB⽂件恢复
持久化的目的是为解决异常导致的数据丢失问题,接下来是使用RDB文件恢复数据。
流程就是当开启自动持久化后,数据会存到名为dump.rdb文件,当重启时,检测到dump.rdb文件后,会自动加载恢复数据。
⼆、AOF持久化
1、AOF持久化的含义
英文名称是AppendOnlyFile,也叫⽂件追加持久化。与RDB不同的是,它是通过保存所执行的写命令来实现的,并且保存数据格式是客户端发送的命令。
2、AOF实现⽅式
AOF持久化方式,需启⽤配置⽂件中的appendonly参数,默认是关闭的。
开启AOF持久化后执行的每⼀条修改数据的命令,都会写入aof_buf缓冲区,后续写⼊AOF⽂件中的操作是由下面的配置来控制的:
三个配置项含义如下:
appendfsync always:每次写入都进行刷盘,性能影响最⼤,占用磁盘IO较⾼,数据安全性最⾼。
appendfsync everysec:1秒刷⼀次盘,性能影响相对较⼩。
appendfsync no:按操作系统机制进行刷盘,性能影响最⼩,数据安全性低。
3、AOF重写机制
随着命令的不断写⼊,AOF⽂件会变得越来越⼤,对此,Redis中提供了瘦身功能,也就是重写机制。
Redis配置文件中有两个对应的参数是来决定重写机制的触发时机的。
auto-aof-rewrite-percentage:AOF⽂件距离上次⽂件增⻓超过多少百分⽐。
auto-aof-rewrite-min-size:AOF⽂件体积最⼩多⼤以上触发。
满足设置的条件时,会自动触发AOF重写,此时Redis会扫描整个实例的数据,重新生成一个AOF文件来达到瘦身的效果。
4、AOF⽂件恢复
AOF和RBD不同,Redis会创建一个没有网络连接的伪客户端执行每条命令恢复数据。
创建伪客户端原因就是AOF中的数据格式,都是由命令组成的。
注意,如开启AOF持久化,会优先使用AOF,只有AOF关闭时,才RDB文件。
三、两种持久化优/缺点
1、RDB优点与缺点
(1)优点
⽂件体积⼩:RDB的⽂件内容是⼆进制格式,因此体积比实例内存⼩。
恢复速度快:当Redis重启时,加载RDB⽂件速度快,短时间内迅速恢复数据。
(2)缺点
数据缺失:RDB保存的是某⼀时刻数据,当Redis某⼀时刻异常时,会致数据丢失。
消耗资源:RDB⽂件的⽣成会消耗⼤量的CPU和内存资源,有⼀定代价。
2、AOF优点与缺点
(1)优点
数据更完整:AOF是即时写入的方式,数据保存更完整。恢复时降低数据损失率。
易读性强:AOF中保存的数据格式是客户端的写⼊命令,可读性性强。
(2)缺点
⽂件体积⼤:AOF中存储客户端所有写命令,随着命令写⼊,⽂件越来越⼤。
增加磁盘IO:AOF刷盘如用每秒刷一次的方式会致磁盘IO升⾼,影响性能。
四、混合持久化
其实就是RDB与AOF的混合模式,是Redis4之后新增的。
1、持久化⽅式
混合持久化是通过aof-use-rdb-preamble参数开启的。
操作方式为:在写⼊的时,先把数据以RDB的形式写⼊⽂件的开头,再将写命令以AOF格式追加到⽂件中,保证数据恢复速度,减少数据丢失⻛险。
2、文件恢复
混合持久化进⾏数据恢复流程为:Redis重启时,先加载RDB的内容,再重放增量AOF格式命令,避免AOF持久化时的全量加载,使加载速率⼤幅提升。
五、总结
RDB持久化
(1)把某时刻数据以二进制形式写⼊到磁盘里,服务重启时检测到对应文件自动加载进行数据恢复。
(2)手动触发和⾃动触发两种机制。
AOF持久化
(1)以⽂件追加的⽅式写⼊客户端执⾏的写命令。
(2)数据恢复时,通过创建伪客户端的⽅式执⾏命令,直到恢复完成。
混合持久化
(1)写入时以RDB形式写⼊⽂件开头,后续写命令以AOF格式追加到⽂件中。
以上为本人个人认知,如有侵权,请联系删除。