持久化介绍

# 引言 >i 作为内存数据库,redis在数据存储和读取上的速度毫不逊色的,但是对于内存来说,断电或者遇到其他故障造成的数据丢失,这点是不可回避的。 ## RDB **1.什么是RDB持久化** Redis Database 快照持久化,是指在某一时刻的内存数据,而持久化则是将这一时刻的数据以二进制形式写入到磁盘里。 **2.手动触发机制** (1)save命令 在Redis里担任的角色是用来手动触发持久化的。也就是说在Redis客户端操作Save命令就可以将内存数据写入到磁盘里。 但是这个命令会造成Redis阻塞,当在使用save命令进行持久化时,后面发来的请求需要等待save完毕。若数据量过大,这是不可行的。save后面发送的请求,都将被拒绝。 (2)bgSabe命令 还有一个bgSave命令。与save不同的是,执行过程中它并不会阻塞客户端的清酒,而是创建一个子进程,交给子进程进行持久化,主进程仍继续接收客户端的请求。 **3.自动触发机制** RDB持久化既可以通过手动触发。也可以通过服务器配置来定期执行。 自动触发通常是Redis中配置文件来执行的。 ``` save m n ``` 其中`m`代表多少秒,`n`代表多少次。 放在一起表示`m`秒内发生了`n`次变化时,触发bgsave. ``` save 900 1 # 900秒内发生1次变化,执行bgsave save 300 10 # 300秒内发生10次变化,执行bgsave save 60 10000 # 60秒内发生10000次变化,执行bgsave ``` 以上代码段,满足任何一条,都会触发bgsave. **4.RDB 文件恢复** 开启自动持久化后,数据会存储到名为dump.rdb的文件中。当Redis服务器重启时,检测到dump.rdb文件后,会自动加载进行数据恢复。 ## AOF **1.什么是AOF** Append Only File,文件追加持久化。 与RDB不同的是,他通过保存所执行的写命令来实现的,并且保存的数据格式是客户端发送的命令。 **2.AOF 实现方式** 想要使用AOF持久化方式,需要启用配置文件中的appendonly参数。默认情况下,Redis是不开启的。 ``` appendonly yes ``` 开启AOF持久化后没执行一条修改数据的命令,Redis就会将该命令写入aof_buf缓冲区。后续写入AOF文件中的操作是由下面的配置来控制的 ``` appendfsync always # 每次写入都进行刷盘操作,对性能影响最大,占用磁盘IO较高,数据安全性最高。 appendfsync everysec # 1秒刷一次盘,对性能影响较小。 appebdfsync no # 按照操作系统的机制进行刷盘,对性能影响最小,数据安全性低。 ``` **3.AOF重写机制** 随着命令的不断写入,AOF文件会变的越来越大,Redis也提供了瘦身(重写)机制。 ``` auto-aof-rewrite-percentage 100 # AOF 文件距离上次文件增长超过多少百分比 auto-aof-rewrite-min-size 64mb # AOF 文件体积最小多大以上触发。 ``` 通过配置Redis配置文件中的上述两个参数,来觉得触发重写机制的时机。 满足所有设置的条件时,会触发AOF重写,此时Redis会扫描整个实例的数据,重新生成一个AOF文件来达到瘦身的效果。 **4.AOF文件恢复** 和RDB不同的是,Redis中通过创建一个不带网络连接的伪客户端来实现。 为什么要创建伪客户端,AOF文件中的数据格式,都是有命令组成的,通过客户端直接执行每条命令就可以将数据进行恢复。 需要注意的是,如果服务开启了AOF持久化功能,会有限使用AOF文件来进行恢复,只有在AOF关闭的状态下,服务器才会使用RDB文件来进行还原。 ## 优点与缺点 **1.RDB** *优点* ++文件体积小++:RDB的文件内容是二进制格式,因此体积比实例内存小。 ++恢复速度快++:当Redis实例恢复时,加载RDB文件速度很快,能在很短时间内迅速恢复数据。 *缺点* ++数据缺失++:RDB保存的是某一时刻的数据,当Redis实例某一时刻异常时,会导致数据丢失。 ++消耗资源++:RDB文件的生产会消耗大量的CPU和内存资源,有一定代价。 **2.AOF** *优点* ++数据更完整++:AOF中是及时写入的方式,数据保存更完整。恢复时降低数据的损失率 ++易读性强++:AOF中保存的数据格式是客户端的写入命令,可读性强。 **缺点** ++文件体积大++:AOF中存储客户端所有的写命令,未经压缩,随着命令的写入,文件会越来越大。 ++增加磁盘IO++:AOF文件刷盘如果采用每秒刷一次的方式会导致磁盘IO升高,影响性能。 ## 混合持久化 ++RDB + AOF,是4.0之后新增的持久化方式。++ **1.持久化方式** 混合持久化是通过aof-use-rdb-preamble参数来开启的,它的操作方式是这样的,在写入的时候,先把数据一RDB的行驶写入文件的开头,再将后续的写命令以AOF的格式追加到文件中,这样既能保证数据恢复时的速度,同事又能减少数据丢失的风险。 **2.文件恢复** 在Redis重启时,先加载RDB的内容,然后再重放增量AOF格式命令,这样就避免了AOF持久化时的全量加载,从而使加载速率得到大幅提升。 ## 总结 **1.RDB** 将某一时刻的数据以二进制的行驶写入到磁盘里。服务器重启时,检测对应文件自动加载进行数据恢复。 有手动和自动两种触发机制。 **2.AOF** 以文件追加的方式写入客户端的写命令。 数据恢复时,通过创建伪客户端的方式执行命令,直到恢复完成。 **3.混合** 在写入的时候先把数据以RDB的形式写入文件的开头,再将后续的写命令以AOF的格式追加到文件中。