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數組。