redis-rdb

RDB持久化

因为Redis是内存数据库,它将自己的数据库状态存储在内存里面,所以如果不想办法将存储在内存中的数据库状态持久化到磁盘中,会导致数据丢失,这一章介绍redis的rdb持久化

RDB文件的创建与载入

有两个Redis命令可以生成RDB文件,一个是SAVE, 另一个是BGSAVE命令,区别就在于SAVE命令会阻塞线程,BGSAVE不会,二者的区别就在于BGSAVE调用fork()方法创建一个子进程用于调用SAVE方法。

Redis没有特别的命令用于加载RDB文件,当服务器启动的时候就会自动检测RDB文件并且载入,值得一提的是,因为我们知道AOF的新鲜度更高,如果开启了AOF,Redis默认采用AOF的方法恢复

设置自动保存方法
比如:
SAVE 900 1
SAVE 300 10
SAVE 60 10000

SAVE X Y的含义是如果在X秒内发生了Y次操作,则会进行BGSAVE操作

具体来说Redis服务器中保存了一个字段saveparam *saveparams,这里记录了秒数和修改数,即我们在配置文件里写的X Y 同时服务器中维护了一个dirty计数器和lastsave属性,其实也很好理解,因为我们需要记录dirty即修改次数,以及上一次BGSAVE的时间。

在服务器内部有一个定时任务serverCron默认100ms就会执行一次,对服务器进行定时的维护,其中一项任务就是检查save选项中的条件是否满足,如果满足则调用BGSAVE命令(这里会遍历上述提到的saveaparams数组), 当执行了SAVE后相应的dirty计数器和lastsave属性需要重新设置

RDB文件结构

RDB: “REDIS” + db_version + database + EOF(终结符) + check_sum

”REDIS“:类似魔数,用于快速检查载入的文件是否为RDB文件
check_sum:就是校验和
db_verion: rdb文件版本

database部分

我们知道Redis服务器中存有多个数据库,默认情况下为16个,database部分会将所有非空的数据库保存下来

具体来说这里database的结构还可以细分为:

SELECTDB db_number key_value_pairs

SELECTDB为常量,当读入程序遇到这个常量时就知道接下来要读数据库号,key_value_pairs记录的是数据库中所有的键值对

key_value_pairs
分为带过期时间和不带过期时间的pairs,带过期时间的结构为:
EXPIRETIME_MS ms TYPE key values
这里EXPIRETIME_MS是常量,TYPE也是常量(有不同类型),例子;
EXPIRETIME_MS 1376674000000 REDIS_RDB_TYPE_STRING key values
这里的TYPE指的是values的type,分为以下几种:

  • REDIS_RDB_TYPE_STRING
  • REIDS_RDB_TYPE_LIST

value的编码