redis是一个内存数据库,所有数据存储在内存中,一旦redis服务器进程退出,则所有数据将会丢失。为了避免发生这种情况,需要对redis中的数据进行定期的持久化。
redis中包含两种持久化方法:RDB持久化和AOF持久化
一、RDB持久化
RDB持久化是将数据库状态保存在一个压缩的二进制RDB文件中。有两个命令可以触发RDB持久化:SAVE和BGSAVE,其中save命令是阻塞主线程进行数据库状态的保存,而bgsave命令是在当前redis进程的基础上fork出一个子进程,在子进程中进行持久化操作,而父进程可以正常处理redis客户端的命令,整个命令阻塞主线程的点是fork子进程时。
1、RDB持久化的优势与劣势
优势:
- 文件采用压缩的二进制文件,在服务求重新加载数据时,耗时更少
劣势:
- rdb持久化时,会导致整个服务器的CPU飙升
- 无法做到实时持久化,使用该持久化会丢失很大一部分数据
2、自动备份
可以通过修改配置项来进行自动RDB持久化,配置项为save m n,意思是在m秒内对数据库进行了n次修改。进行检查的定时任务包含在serverCron中,默认100ms执行一次
3、bgsave命令执行过程
- 执行bgsave命令,服务器父进程判断是否有其他子进程存在,如果存在则直接返回
- redis父进程fork出一个子进程
- fork完成后,父进程继续处理其他命令,子进程进行RDB文件的保存。
- 备份完毕,发送信号给父进程
二、AOF持久化
AOF持久化的更新频率比RDB的高,所以如果redis开启了AOF持久化,则优先启用AOF文件进行数据reload,只有在未开启AOF持久化时,才会使用RDB
1、AOF持久化的过程
AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态。,其主要分为三个主鸭子步骤
- 命令追加:服务器在执行完一个写命令后,会以协议格式将被执行的命令追加到服务器状态aof_buf属性的末尾
- 文件写入 调用系统write命令将aof_buf缓冲区内容写入内存缓冲区
- 文件同步 将内存缓冲区内容同步到硬盘中
其中包含三种同步策略,通过appendfsync配置项控制
- always 将aof_buf缓冲区的所有内容写入并同步到AOF文件
- everysec 将aof_buf缓冲区的内容写入到AOF文件,如果上次同步AOF文件的时间距离现在超过了1s,则再次对AOF文件进行同步,这个同步操作由一个线程专门负责
- no 只写入,不同步
2、AOF重写
随着服务器运行的时间,AOF文件会越来越大,需要定期对AOF文件中的命令进行整合,以减小AOF文件的大小。
AOF重写流程
- redis进程fork出子进行执行重写操作
- 子进程通过当前的数据库状态进行命令的重写
- 此时redis父进程如果发生写操作,则将写操作写入AOF重写缓冲区
- 子进程重写完成,发送信号给父进程
- 父进程将AOF重写缓冲去内容合并到新的AOF文件中,然后原子的替换掉原来的AOF文件
三、混合持久化
这是redis4.0之后提供的功能,顾名思义,是将RDB和AOF持久化混合使用,这是由于
- RDB 持久化能够快速地恢复数据, 但是在服务器意外停机时会丢失大量数据;
- AOF 持久化能够有效地提高数据的安全性, 但是在恢复数据时却要耗费大量的时间。
这种持久化是在AOF重写时,创建一个包含数据库状态的AOF文件,文件开头是当前的数据库状态的RDB数据,重写之后的数据则以AOF文件格式追加到文件末尾