RDB 数据的组织方式
RDB 的文件组织方式为:数据集序号1:操作码:数据1:结束码:校验和----数据集序号2:操作码:数据2:结束码:校验和......
其中,数据的组织方式为:过期时间:数据类型:键:值,即 TVL(type,length,value)。
举两个字符串存储的例子,其他的大概都以至于的形式来组织数据:
可见,RDB 持久化的结果是一个非常紧凑的文件,几乎每一位都是有用的信息。如果对 redis RDB 数据组织方式的细则感兴趣,可以参看 rdb.h 和 rdb.c 两个文件的实现。
对于每一个键值对都会调用 rdbSaveKeyValuePair(),如下:
int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val,
long long expiretime, long long now)
{
// 过期时间
/* Save the expire time */
if (expiretime != -1) {
/* If this key is already expired skip it */
if (expiretime < now) return 0;
if (rdbSaveType(rdb,REDIS_RDB_OPCODE_EXPIRETIME_MS) == -1) return -1;
if (rdbSaveMillisecondTime(rdb,expiretime) == -1) return -1;
}
/* Save type, key, value */
// 数据类型
if (rdbSaveObjectType(rdb,val) == -1) return -1;
// 键
if (rdbSaveStringObject(rdb,key) == -1) return -1;
// 值
if (rdbSaveObject(rdb,val) == -1) return -1;
return 1;
}
在 rdb.h, rdb.c 中有关于每种数据的编码和解码的代码,感兴趣的同学可以详细研读一下。