前言
Redis 是内存数据库,如果不将内存中的数据保存到磁盘,进程退出的时候内存中的数据也会被清除。为了解决该问题,Redis 持久化有两种方式,分别是RDB和AOF。下面会比较详细介绍这两种持久化方式。
RDB方式
RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能就是把某个时间点的内存数据状态保存到一个经过压缩的二进制文件(即 RDB文件)中。
1、配置选项执行
在redis.conf文件中配置如下:只要满足以下三个条件中的任何一个就会触发持久化操作:
- 服务器900秒之内,对数据库进行至少1次修改
- 服务器300秒之内,对数据库进行至少10次修改
- 服务器60秒之内,对数据库进行至少10000次修改
2、手动执行
手动执行,可以在客户端中直接运行save、bgsave、bgrewriteaof命令触发持久化操作。save命令执行是同步操作,Redis服务器会被阻塞, 所以客户端请求会被阻塞;bgsave命令执行是异步操作,会创建一个子进程来完成RDB持久化操作,所以当用bgsave创建RDB文件的过程,服务器仍然可以处理客户端的请求;bgrewriteaof命令跟bgsave差不多。
3、RDB小结
RDB方式持久化是在某个时间点把内存中key-value数据同步到RDB文件中。
AOF方式
AOF 持久化是通过把Redis 服务器所执行的写命令追加到AOF文件的方式来实现的。AOF持久化功能的实现分为命令追加、文件写入和文件同步三步骤。
1、开启AOF
在redis.conf文件中配置如下:
appendonly yes appendfilename "appendonly.aof"
默认是no关闭状态。
2、命令追加
服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓存区的末尾。
3、文件写入
服务器会调用flushAppendOnlyFile函数,并根据服务器配置的appendfsync选项的值类决定是否把aof_buf缓存区的数据写入保存到AOF文件中。
appendfsync 选项的值 | flushAppendOnlyFile 函数行为 |
always | 将aof_buf缓冲区中的所有内容写入并同步到AOF文件 |
everysec |
将aof_buf缓冲区中的所有内容写入到AOF文件,如果上次同步AOF 文件的时间距离现在超过一秒钟, 那么再次对AOF文件进行同步,并且这个同步操作是用一个线程专门负责执行的 |
no | 将aof_buf缓冲区中的所有内容写入到AOF文件,但不对AOF文件进行同步,何时同步由操作系统来决定 |
默认值是 everysec。
4、文件同步
为了提高文件的写入效率,现在操作系统中,当用户调用write函数,将一些数据写入到文件的时候,操作系统通常会将写入的数据暂时保存咋一个内存缓冲区里面,等到缓冲区的空间呗填满、或者超过指定的阀值后,才真正的将缓冲区中的数据写入到磁盘中。