天天看點

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