天天看点

tokyo cabinet源代码分析(1)

1.基本介绍

tokyo cabinet是key value数据库(官方主页为:http://fallabs.com/tokyocabinet/),由日本人开发应用比较广泛,作者本人是在日本的一个社交网站工作(貌似是日本国内最大的)。张宴的blog对其在金山公司的应用有相应的阐述。

toky cabinet数据库主要的实现有:(1)HASH 结构;(2)B+树结构;(3)Fixed-Length结构;(4)Abstract 结构。

由于key value数据库本身的实现涉及到数据结构、内存组织、文件读写等多个方面,对于其中的实现细节能够有了解,对于数据结构、程序设计功底有较高的提升。所以打算对于tokyo cabinet的源代码进行一个分析。先主要对于abstract类型数据库进行一个分析。

2. Abstract database

 Abstract数据库主要是通过内存实现Hash 数据库,B+树数据库等。主要对于Hash结构进行分析。

2.1 Abastrat数据库主要数据结构

 先对于TCADB的初始化进行分析。

/* Create an abstract database object. */

TCADB *tcadbnew(void){

TCADB *adb;

TCMALLOC(adb, sizeof(*adb));

adb->omode = ADBOVOID;

adb->mdb = NULL;

adb->ndb = NULL;

adb->hdb = NULL;

adb->bdb = NULL;

adb->fdb = NULL;

adb->tdb = NULL;

adb->capnum = -1;

adb->capsiz = -1;

adb->capcnt = 0;

adb->cur = NULL;

adb->skel = NULL;

return adb;

}

 其中,根据初始化传入参数不同,建立不同类型数据库。

2.2TCADB数据库打开操作

   通过tcadbopen打开数据库,并对于TCADB结构体指针进行初始化。

   由于是实现hash database,对于TCMDB结构体进行初始化。

   /* Open an abstract database. */

bool tcadbopen(TCADB *adb, const char *name){

assert(adb && name);

/*根据配置进行相应的打开操作*/

if(adb->omode != ADBOVOID) return false;

/*应该是可以配置数据库相关参数,然后通过#进行分割*/

TCLIST *elems = tcstrsplit(name, "#");

/*获得实际的路径,如果是*,则为内存数据库*/

char *path = tclistshift2(elems);

if(!path){

tclistdel(elems);

return false;

}

/* 此时设置为on-memory hash database,

* 对于mdb进行内存分配*/

else if(!tcstricmp(path, "*")){

adb->mdb = bnum > 0 ? tcmdbnew2(bnum) : tcmdbnew();

adb->capnum = capnum;

adb->capsiz = capsiz;

adb->capcnt = 0;

adb->omode = ADBOMDB;

 2.2.1 TCMDB结构

  TCMDB结构是on-memory hash database。

/*HASH数据库结构*/

typedef struct { /* type of structure for a on-memory hash database */

void **mmtxs; /* mutexes for method */

void *imtx; /* mutex for iterator */

TCMAP **maps; /* internal map objects */

int iter; /* index of maps for the iterator */

} TCMDB;

其中TCMAP结构是MAP数组。

/*TCPMAP数据结构*/

typedef struct { /* type of structure for a map */

TCMAPREC **buckets; /* bucket array */

TCMAPREC *first; /* pointer to the first element */

TCMAPREC *last; /* pointer to the last element */

TCMAPREC *cur; /* pointer to the current element */

uint32_t bnum; /* number of buckets */

uint64_t rnum; /* number of records */

uint64_t msiz; /* total size of records */

} TCMAP;

MAP结构中含有Hash buckets数组。