redis RDB持久化基本原理

420 阅读2分钟

rdb文件的创建

可以通过下面两个命令使Redis创建RDB文件。

  • save Redis server被阻塞,无法处理任务。
  • bgsave Redis server创建子进程进行RDB文件创建,父进程继续处理请求。

image.png

fork函数会创建出一个子进程。该子进程有其独立的进程空间,但是该子进程会获得父进程已经打开的文件描述符等信息,子进程会拥有父进程相同的PC(程序计数器),会拥有父进程相同的CPU寄存器。由于有相同的PC,所以,子进程会与父进程一样在执行后面的程序。fork函数会返回两个值,其实是一个返回值,只是在父子进程中返回值不同而已。在父进程中返回新创建的子进程pid,在子进程中返回0。

上面图中,从fork返回后,就有两个进程,都会执行if pid == 0,只是只有子进程的判断才会通过。

bgsave执行

执行时机

可以通过配置文件或者启动时指定bgsave执行时机。Redis默认配置: save 900 1 # 距离上次rdb,900s内有1次变更

save 600 10 # 距离上次rdb,600s内有10次变更

save 60 10_000 # 距离上次rdb,60s内有10_000次变更

上面的配置只要触发了其中一条就会进行rdb。

这些配置在Redis中怎么保存呢?

image.png

image.png

image.png

把配置保存了,还需要记录一下上次rdb的时间和从上次rdb之后数据变更的次数。

image.png

image.png

执行

image.png

redis默认每100ms执行一次上面的判断。可以看到只要满足条件之一就会执行BGSAVE。

这个伪代码,在BGSAVE()后面应该来一行break退出循环。