mdb – memory db
mdb是cabinet的一种数据组织方式,其他还有hdb(hash)、bdb(btree)等,详见"tokyo cabinet源码分析"。
由名字可知,mdb使用纯内存(不一定,见下面),速度最快。它是后面其他较高级的数据组织方式的基础,hdb、bdb的read cache都是直接使用mdb实现。而且mdb的实现最简单,所以先从mdb分析。
先贴出mdb结构图片:
也有画做下图的:
个人觉得下图不如上图容易理解; 第一次看下图的时候,还以为hash冲突是用链表来解决的,仔细观察下图的第三对key、value,后面连接了两对key、value; 其实不是画错了,而是说明这里的结构是二叉搜索树,而非链表
Tokyocabinet的MAP存储的记录的存储结构体为:
typedef struct _TCMAPREC { /* type of structure for an element of a map */
int32_t ksiz; /* size of the region of the key */
int32_t vsiz; /* size of the region of the value */
struct _TCMAPREC *left; /* pointer to the left child */
struct _TCMAPREC *right; /* pointer to the right child */
struct _TCMAPREC *prev; /* pointer to the previous element */
struct _TCMAPREC *next; /* pointer to the next element */
} TCMAPREC;
该结构体有些特殊,一般我们看到的存储的结构体是有数据指针的,但是这里只有上下左右节点的指针和key、value的大小,却没有数据指针,作何解释呢?
原来是这样的:
大概是为了少malloc一次内存,于是在添加一条记录的时候,直接把存储结构体的内存和key、value的内存一并申请了: TCREALLOC(rec, rec, sizeof(*rec) + ksiz + psiz + vsiz + 1);
这样data的起始地址其实就是 rec + sizeof(*rec) 了。
参考资料:
http://topic.xhttp.cn/view/100/
http://hi.baidu.com/sing520/blog/item/60a29bcbaac3b0f352664ffa.html
http://hi.baidu.com/sing520/blog/item/60453c9787a5296355fb96b6.html
http://gavin.iteye.com/blog/553948