1、rdb持久化功能将内存数据保存到磁盘上,避免数据意外丢失,rdb文件是一个经过压缩的二进制文件,可以还原内存数据状态
2、redis文件的创建与载入
2.1、save bgsave
2.2、save命令会阻塞redis服务器进程,直到rdb文件创建完毕为止,不会接受任务命令请求
2.3、bgsave会派生一个子进程,然后子进程负责创建rdb文件,可以继续处理命令请求
创建rdb文件实际由rdbsave函数完成
2.4、rdb载入工作是在服务器启动时自动执行,并没有专门的命令载入,载入期间,一直阻塞其他命令
3.5、aof文件的更新频率比rdb文件更新频率高,所以如果服务器开启了aof持久化功能,优先使用aof文件来还原数据库转态,aof功能关闭状态时,服务器才会使用rdb文件还原数据库状态
bgsave命令执行时候,拒绝下一个bgsave
bgrewiteaof 和bgsave不能同时执行,会拒绝下一个
4、自动间隔保存
save 900 1 ,900秒内,对数据库进行了至少一次修改,保存在saveparams 数组中
4.1、dirty计数器 lastsave属性
dirty计数器保存了上一次save或者bgsave后,对数据库状态进行了多少次修改,包括写入,删除,更新
lastsave保存上一次save或者bgsave的unix时间戳
4.2、检查保存的条件 saveparams是否满足,servercron每100毫秒执行一次
5、rdb文件结构 REDIS db_version databases EOF check_sum
开头是5字节,REDIS字符,快速检查载入的是否是RDB文件
db_version 长度4字节,值是一个字符串表示的整数记录了rdb版本号
databases包含零个或任意多个数据库,以及各个数据库中的键值对数据,如果服务器的数据库,所有的库,为空,那么这部分也是空
EOF 长度为1字节,标志着rdb文件正文内容的结束
check_sum 8字节,保存着一个校验和,通过前面四个部分内容计算得出,检查文件是否有损坏
6、databases部分,如果0号和3号为非空,那么database0 保存着0号数据库中所有的键值对,database3保存着3号数据库中所有的键值对
每个非空数据库的rdb文件都可以保存为selectdb db_number key_value_pairs三个部分
selectdb常量长度为1字节,当程序遇到这个值时候,它知道接下来要读的将是数据库号码
db_number保存着一个数据库号码,根据号码的大小不同,长度可以是1 2 5 字节,读入db_nuber后,服务器会立即调用select命令,切换数据库,key_value_pairs保存着所有的键值对,根据键值对的数量 类型 内容 以及是否有过期时间的不同,key_value_pairs长度也会有所不同
7、key_value_pairs type 1字节 key value三部分组成
带有过期时间的 expiretime_ms常量 1字节,告知读入程序接下来将是一个以毫秒为单位的过期时间 ms 8字节长的带符号整数,记录一个以毫秒为单位的unix时间戳
网友评论