RDB执行流程(原理)
1. Redis
父进程首先判断:当前是否在执行
save
,或
bgsave/bgrewriteaof
(
aof
文件重写命令)的子进程,如果在执行则bgsave
命令直接返回。
2.
父进程执行
fork
(调用
OS函数复制主进程)操作创建子进程,这个复制过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。
3. 父进程 fork 后, bgsave 命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令。
4. 子进程创建 RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。( RDB 始终完整)
3. 父进程 fork 后, bgsave 命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令。
4. 子进程创建 RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。( RDB 始终完整)
5.
子进程发送信号给父进程表示完成,父进程更新统计信息。
6.
父进程
fork
子进程后,继续工作。
RDB文件结构
1 、头部 5 字节固定为 “REDIS” 字符串
![](https://img-blog.csdnimg.cn/20200731221540826.png)
1 、头部 5 字节固定为 “REDIS” 字符串
2
、
4
字节
“RDB”
版本号(不是
Redis
版本号),当前为
9
,填充后为
0009
3
、辅助字段,以
key-value
的形式
![](https://img-blog.csdnimg.cn/20200731221825256.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lpZGFuNzA2Mw==,size_16,color_FFFFFF,t_70)
4
、存储数据库号码
5
、字典大小
6
、过期
key
7
、主要数据,以
key-value
的形式存储
8
、结束标志
9
、校验和,就是看文件是否损坏,或者是否被修改。