之前讲了aof,今天来讲讲rdb。
rdb简单来说就是将redis存在内存中的数据形成快照,持久化到硬盘,这里跟aof是不一样的,aof是将命令逐个写入,方便后面replay,这里是直接写入数据。
有两个Redis命令可以用于生成rdb文件,一个是SAVE,另一个是BGSAVE。前者会阻塞redis服务器进程,直到RDB文件创建完毕为止,在服务器阻塞期间,服务器不能处理任何命令请求;而后者会在后台fork出来一个子进程,由子进程来执行rdb文件的创建,父进程继续处理命令请求,在此期间,父进程会拒绝SAVE、BGSAVE命令,并阻塞BGREWRITEAOF命令。创建rdb文件的两条命令终都会调用rdbSave函数来完成任务。
而rdb文件的载入是在系统启动时自动完成的,其载入与否取决于aof持久化功能是否开启,若aof功能开启,则载入aof文件;若aof功能没有开启,则载入rdb文件来还原数据库状态,载入rdb文件的实际工作是由rdbLoad函数来完成的。
除了在配置文件中可以自己定义rdb自动执行BGSAVE命令的时机,redis服务器当中还维持着一个dirty计数器,以及一个lastsave属性:
1. dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态进行了多少次修改。
2. lastsave属性时一个UNIX时间戳,记录了上一次成功执行SAVE或者BGSAVE命令的时间。
这两个参数配合redis配置文件中的选项,就可以很好的完成rdb文件的自动保存功能了
我们可以使用od命令来分析redis服务器产生的rdb文件,该命令可以用给定的格式转存并打印输入文件,例如
$ od -c dump.rdb
.......
.......
也可以使用redis本身自带的rdb文件检查工具redis-check-dump,