使用SAVE和BGSAVE生成rob文件。rob文件可以用来还原数据库状态
- 底层细节:
而这两个方法的实质都是调用rdbsave()方法来执行保存数据库的操作
只是SAVE方法是单线程的,而bgsave方法相当于开了一个子进程来保存rob文件
- 注意:
由此可见,当使用save命令时,redis不能执行其他操作。若此时有其他操作,会等待save执行完毕后继续执行
BGSAVE在保存时,若有其他命令,则会使用子进程进行保存,父进程用于执行其他命令
redis启动时,若检测到有rob文件,会自动载入(因为aof文件的使用频率比较高,所以若是同样有aof文件,会优先加载aof)
当rob文件在加载时,服务器处于阻塞状态,任何其他的命令都会被暂停
他们的执行方式还有些有趣的地方:
- 自动保存
- 如何设置自动保存
可以对redis进行设置,要求其进行自动保存。具体的命令方式如下:
SAVE方法相当于向saveparam数据体系传入以上参数。这些参数的含义如下
SAVE 900 1的意义:900秒内,若其修改数达到1次,就对它进行保存
- 除了这个saveparam,还有两个参数是必要的,dirty(long)和lastsave(时间戳),分别记录修改的次数,和上一次修改的时间
- 自动保存的流程:
redis自动规定每隔100ms便对服务器检察一次,对其进行数据的保存,这个检查的函数是serverCorn。
每当执行这个函数时,会去检查saveparam中设置的值。由于我们有firty和lastsave,我们便可以知道距离上一次保存过了多久,以及中间修改了多少次。而这些条件刚好和saveparam的两个参数契合。所以当判断条件符合saveparam时,就会进行BGSAVE。
serverCorn的伪代码如下
- ROB文件结构
其中databases是一个数组,用于保存database结构。database结构如下
k_v_paris是用于保存数据库数据
由于有些数据库数据会过期,所以它的结构分为两种,带过期时间和不带的
不带过期时间如下
带过期时间如下
value用于保存对象数据,这些对象和我们在之前在2中介绍的一样