redis文件持久化
本篇文章主要介绍redis的持久化机制,文件的读,写,恢复等内容,希望通过阅读该部分内容,能有一个redis持久化的清晰认识。
附加一个专栏地址,有需要的小伙伴,请移步查看!
本次内容大纲结构如下:

1、RDB方式
因为redis还内存数据库,它将自己的数据库状态存在内存里面,如果不想办法保存在磁盘中,那么一旦服务器退出进程,服务器中的状态也会消失不见。RDB持久化方式既可以手动执行,也可以自动执行,该功能可以将某个时间点上的数据库状态保存在一个RDB文件中(经过压缩的二进制文件)。
1.1、文件创建与写入
有两个redis命令用于生成RDB文件,一个是SAVE,另一个是BGSAVE。
- SAVE命令会阻塞Redis服务器进程,直到RDB文件创建爱你完毕为止,在服务器阻塞期间,服务器不能处理任何命令。
- BGSAVE命令会派生出一个子进程,然后由子进程负责创建爱你RDB文件,服务器(父进程)继续处理请求命令。
RDB文件的载入工作是在服务器启动时自动执行的,所以Redis并没有专门用于载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件。另外,因为AOF文件的更新频率比RDB文件高,所以如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库。
BGSAVE、SAVE和BGREWRITEAOF命令不能同时执行;服务器在载入文件期间,会一直处于阻塞状态,直到载入工作完成为止。
1.2、自动间隔性保存
用户可以通过save选项设置多个保存条件,只有其中任意一个被满足,服务器就会执行BGSAVE命令。
例如(默认条件):
save 900 1
save 300 10
save 60 10000
含义如下:
- 服务器在900秒内,对数据库进行了至少1此修改。
- 服务器在300秒内,对数据库进行了至少10此修改。
- 服务器在60秒内,对数据库进行了至少10000此修改。
除了保存条件,服务器状态还维持着一个dirty计数器,以及一个lastsave属性:
- dirty计数器记录距离上一次成功执行save或者bgsave命令之后,服务器对数据库状态进行了多少次修改(包括写入,删除和更新)。
- lastsave:属性是一个UNIX时间戳,记录了服务器上一次成功执行save或者bgsave命令的时间。
redis的服务器周期函数serverCron默认每隔100毫秒就会执行一次,该函数用于对正在运行的服务器进行维护,它的其中一项工作就是检查save选项所设置的保存条件是否已经满足,如果满足的话就执行bgsave命令。

1.3、文件结构
RDB文件的结构如下:

- REDIS部分是文件的开头,长度为5个字节,保存“redis”字符,用于快速检查是否是RDB文件。
- db_version长度为4个字节,它的值是一个字符串表示的整数,记录了RDB文件的版本号。
- databases部分包含着零个或者任意多个数据库,以及各个数据库中的键值对数据。如果服务器的数据库状态为空,那么这个部分也为空,长度为0;如果非空,根据数据库保存键值对的数量、类型和内容不同,长度也不同。
- EOF常量的长度为1字节,标志RDB文件的结束。
- check_sum是一个8字节的无符号整数,保存着一个校验和,检查RDB文件是否出错或者损坏。
- SELECTDB常量的长度为1字节,表示接下来是数据库号码。
- db_number保存着一个数据库号码,可以是1,2或者5字节。
- key_value_pairs部分保存着数据库中的所欲键值对,如果设置了过期时间,过期时间也会保存。根据键值对的数量,类型,内容以及是否有过期时间等条件的不同,长度也会不同。
2、AOF方式
除了RDB持久化功能以外,Redis还提供了AOF持久化功能;与RDB不同的是AOF持久化是通过记录Redis服务器执行的写命令来记录数据库的状态的。
2.1、持久化
AOF的持久化功能的实现分为三个步骤:追加,文件写入,文件同步。
- 追加
当AOF持久化功能处于打开状态时,服务器执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾。
- 文件写入
Redis服务器进程就是一个事件循环,在时间循环结束之前,它都会考虑是否需要将aof_buf缓冲区的内容写入到AOF文件中。
2.2、文件载入与数据还原
因为AOF文件中包含了重建数据库所需的所有写命令,所以服务器只要读入并执行一遍AOF文件,就可以恢复服务器的状态。
2.3、重写
这里就不在介绍各种重写方案了,就说一下Redis采用的方法,通过读取服务器当前的状态来实现AOF文件的重写。
因为Redis采用单进程的方式,所以如果主进程负责重写工作的话,就不能处理客户端的请求。所以在Redis中采用子进程来负责AOF重写。当一个写命令执行完之后,它会同时发送给AOF缓冲区和AOF重写缓冲区。
2616

被折叠的 条评论
为什么被折叠?



