本文带大家了解一下 Redis 数据一种持久化方式 RDB 的实现。包括 Redis 内存快照 RDB ⽂件的创建时机以及⽣成⽅法。可以让你掌握 RDB ⽂件的格式,学习如何制作数据库镜像。
RDB 创建的入口函数
Redis 创建 RDB 文件的函数有三个,分别是 rdbSave, rdbSaveBackground, rdbSaveToSlavesSockets 这三个函数。
rdbSave
rdbSave 是 Redis 在本地磁盘创建 RDB ⽂件的入口函数。它对应了 Redis 的 save 命令,会在 save 命令的实现函数 saveCommand 中被调用,这个命令是使用主线程执行的,会阻塞其他命令的执行。rdbSave 函数最终会调用 rdbSaveRio 函数来实际创建RDB⽂件。
rdbSaveBackground
rdbSaveBackground 是 Redis 使⽤⼦进程方式在本地磁盘创建 RDB ⽂件的入口函数。它对应了 Redis 的 bgsave 命令,会在 bgsave 命令的实现函数 bgsaveCommand 中被调⽤。这个函数会调⽤ fork 创建 ⼀个⼦进程,让⼦进程调用 rdbSave 函数来创建 RDB ⽂件,而主线程本⾝可以继续处理客户端请求。
int rdbSaveBackground(char *filename, rdbSaveInfo *rsi) {...if ((childpid = fork()) == 0) {// 子进程执行方法...// 调用 rdbSave 创建 RDB 文件retval = rdbSave(filename,rsi);...// 子进程退出exitFromChild((retval == C_OK) ? 0 : 1);} else {/* Parent */// 父进程也就是主线程执行方法...return C_OK;}return C_OK; /* unreached */}
rdbSaveToSlavesSockets
rdbSaveToSlavesSockets 函数是 Redis 采用不落盘方式传输 RDB 文件进行主从复制时,创建 RDB文件的入口函数。
与 rdbSaveBackground 函数类似,rdbSaveToSlavesSockets 也是通过创建子进程,让子进程创建 RDB 文件。与 rdbSaveBackground 不同的是,rdbSaveToSlavesSockets 是通过网络以字节流的形式直接发送 RDB 文件的二进制文件数据给从节点。
RDB 创建时机
从上面的分析中我们知道 RDB 文件创建的三个时机分别是执行 save 命令、执行 bgsave 命令和进行主从复制。除了这几个时机还有哪些地方会触发 RDB 文件