29 August 2015

RDB持久化概念

redis服务器将内存中的数据库状态保存在磁盘里面,避免数据丢失。RDB 文件是二进制文件。

ps:RDB持久化可以手动执行,也可以根据服务器配置选项定期执行。

RDB文件的创建与载入

SAVE 命令: 生成RDB文件的命令,会阻塞redis服务器进程。

BGSAVE命令: 会派生一个子进程,然后由子进程生成RDB文件。

redis的RDB文件的载入工作是在服务器启动时自动执行,所以redis没有专门用于载入RDB文件的命令。

只要redis服务器在启动时检测到RDB文件存在,就会自动载入RDB文件。

ps :如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件还原数据库状态。

RDB文件自动间隔性保存

redis 的配置文件中有save选项:

默认配置为:

save   900   1
save   300   10
save    60     10000

服务器会把save配置项,保存在redisServer的saveparams属性中,saveparams属性是个数组,结构如下:

dirty计数器和lastsave属性

dirty 属性:保存着数据被修改的次数。

lastsave属性:数据最近一次被修改的时间戳。

redis服务器会周期性的操作serverCron函数,默认100毫秒就会执行一次。serverCron就是检查save选项所设置的保存条件是否满足,满足的话就执行BGSAVE命令。

RDB文件结构

REDISDb_versionDatabasesEOFCheck_num

Db_version: 记录redis的版本。

Databases:保存0个或任意多个数据库,以及数据库中的键值对数据。

EOF:常量的长度为1个字节,这个常量标志着RDB文件的正文内容结束。

Check_num : 是个8字节长的无符号整数,保存着一个校验和。这个值是通过前4个参数计算出来的。作用就是检查RDB文件是否出错或者损坏。

1 .Databases部分

假设0 ,3 号库不为空,那么RDB文件的结构为:
REDISDb_versionDatabase 0Database 3EOFCheck_num

2 . 每一个database的结构:

SELECTDBDb_numberKey_value_pairs
SELECTDB:是一个常量,长度为1字节。
Db_numer:保存数据库的号码。调用select 命令进行数据库切换。
Key_value_pairs: 保存该数据库的所有键值对。

3 . key_value_pairs的结构:

1).不带过期时间的键值对的结构:
TypeKeyValue

2) .带过期时间的键值对的结构:
EXPIRETIME_MSMsTypeKeyValue

Type:记录value值的类型,是个常量,长度为1字节。

Key:是一个字符串编码对象。

Value : redis 各种类型的数据对象。

EXPIRETIME_MS: 常量,表示将要读入一个时间戳。

Ms:键值对的过期时间,毫秒为单位的时间戳。

分析RDB文件

使用od命令来分析redis的RDB文件。

比如:

od  –c    以ASC2编码的方式打印输出文件。
od  -x      以16进制打印输出文件。
od 命令最好把这两个参数结合起来用,那么打印出来的信息更充分。

Ps:redis 有自带的RDB文件检查工具redis-check-dump,网上有很多处理RDB文件的工具。