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数组。