持久化介绍
# 引言
>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的格式追加到文件中。