redis(9)rdb持久化

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时间戳

你可能感兴趣的:(redis(9)rdb持久化)