一個簡單的nosql數據庫vDB的實現

github地址:https://github.com/viktorika/vDB.git

參考資料

這份代碼是參考APUE寫的,採用的結構跟書裏是一模一樣,不一樣的只是代碼風格以及部分細節上的區別,所以本文下面所說的實現則是解釋一下APUE是怎麼做的。

數據庫文件類型

首先得講講這個數據庫會生成兩個文件。

1.索引文件.idx

2.數據文件.dat

數據庫文件存儲結構

再來講講裏面的結構,索引文件採用的是hash表結構。採用鏈表來解決衝突,所以每個節點都會有一個指針會指向下一個節點,這個指針在文件中表現爲偏移量,這裏我們統一稱呼它爲ptr結構。

首先我們將.idx文件分成兩部分

1.前半部分,空閒鏈表頭節點+hash表所有節點的頭節點

2.後半部分,一個個index記錄,不管是空閒的節點還是非空閒的節點他們都是一個index記錄。

假設我們一 個ptr的大小爲ptr_size,hash表的大小爲hash_table_size,那麼前半部分佔用的字節數就爲(hash_table_size + 1) * ptr_size。

這裏我們表示空白的話是用空白符' '來填充的。

再來說說一個index記錄的結構

這個記錄我們分成三部分

1.剛剛所說的ptr。

2.真正index記錄的長度(長度是用固定字節數的所以無需分隔符,這個字節數用index_size來代替)。

3.真正的index記錄。

真正的index記錄的格式是這樣的:

xxx:xxx:xxx\n

':'符號爲分隔符,\n是終止符,每條記錄最後都是有\n來終止的,data記錄也是一樣的。

通過':'符號分成了三部分。

1.key。

2.data在.dat文件中的偏移量。

3.data的偏移量。

這就是一個完整的index記錄。

最後說一下data記錄

這個其實沒什麼好說的了,就是每條記錄都由\n來隔開。

 

具體實現請到github上自行看代碼,已經做了詳細的註釋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章