redis持久化
RDB
RDB持久化功能,可以将Redis在内存中的数据库状态保存到磁盘中,避免数据意外丢失.
生成RDB文件
- SAVE
会阻塞Redis服务器进程,直到RDB文件创建完毕为止. - BGSAVE
不会阻塞服务器,会fork一个子进程,由子进程来创建RDB文件.
自动间隔保存
- 用户通过save选项设置多个保存条件,只要一个满足,服务器就会执行BGSAVE
save 900 1 ----服务器在900秒之内,对数据做了至少一次修改
save 300 10 -----300秒之内,对数据库进行了至少10次修改
save 60 10000 ----60秒之内,对数据库进行了至少10000次修改
RDB文件结构
- RDB文件头
5个字节,'R','E','D','I','S' - db_version
长度4字节,是字符串表示的整数,记录了RDB文件的版本号 - database
- 如果服务器数据库为空,这个部分也是空
- EOF
长度为1字节,常亮,标志RDB文件的结束 - check_sum
8字节长无符号整数,保存着校验和,由前面4部分计算得出,载入时,通过check_sum比对来确定RDB文件是否有损坏
database部分
一个RDB文件的database 部分可以保存多个非空数据库,每个非空数据库在RDB文件中都可以保存为SELECTDB,db_number,key_value_pairs
- SELECTDB
常量,1字节,表示接下来读取的是数据库号码 - db_number
保存着数据库号码,根据号码大小的不同,这个长度可以是1字节,2字节,5字节,读取这个属性后,会切换到对应的数据库上 - key_value_pairs
存储数据库中的所有键值对,如果键值对带有过期时间,过期时间会和键值对保存在一起,根据不停的键值对数量,类型,内容,以及是否有过期时间等条件,key_value_pairs部分的长度也不同-
不带过期时间
-
带过期时间
-
AOF
Append Only File
通过服务器所执行的写命令来记录数据库状态.
AOF持久化实现
分为: 命令追加,文件写入,文件同步
- 命令追加
服务器执行完一个写命令后,会已协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区结尾. - 文件写入和同步
事件循环结束之前,会调用flushAppendOnlyFile
考虑是否将aof_buf缓存区中的内容吸入保存到AOF文件中.
flushAppendOnlyFile 由 服务器配置的appendfsync值决定
AOF重写
随着时间流逝,AOF文件中的内容越来越多,文件体积越来越大,为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写功能.
- 子进程进行AOF重写
- 重写期间的写命令请求,会写到AOF重写缓存区,AOF重写完成后,再把AOF重写缓冲区中的数据写入AOF文件中
注: 因为AOF文件更新频率比RDB高,所以服务器开启了AOF持久化功能,服务器会优先使用AOf文件还原数据.只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态
网友评论