源碼下載:
正文:
所謂的Key-Value就是每次存儲一個數據時,是根據Key進行索引存儲的。為了實現Key的快速查找功能,我使用了B-tree存儲結構。B-tree被大量用於數據庫的索引中,所以選用B-tree想必不會有太大的問題。Value是對應該Key的值,他的長度是未知的,所以要實現這樣一個存儲系統,必須要解決從Key值到文件位置的映射關系。
問題一:實現文件的"自由"讀寫
問題二:實現BTree
問題一:實現文件的"自由"讀寫。
基本思想:所有內容被存儲到一個文件中,文件被划分成同一大小的粒度,可以自由的申請不同的大小空間,可以釋放已經申請的空間。使得文件操作可以和內存操作接口一致。
基於上述的需求,我的文件存儲結構如下圖所示:
1 typedef struct _diskatom{ 2 int64 self; //自身索引 3 int64 next; //下一索引 4 int64 pre; //前一索引 5 int64 ext; //擴展索引 6 int size; //大小 7 unsigned char info; //信息[1:HEAD|1:USED|0|0|0|0|0|0] 8 unsigned char dirty; 9 unsigned char data[DISK_ALLO_SIZE]; 10 }diskatom_t; 11 12 typedef struct _diskctx{ 13 int64 ctxtop; 14 int64 num_used; 15 int64 num_free; 16 diskatom_t list_used; 17 diskatom_t list_free; 18 }diskctx_t;
申請空間:
1. 計算申請大小需要幾塊空間。
2. 檢查空閑列表中是否有足夠的空間。
3. 存在足夠的空閑塊,將空閑塊移動至"使用列表"。
4. 空閑空間不足,擴充文件大小,將新增塊插入"使用列表"。
釋放空間:
正好和申請空間相反。
1. 將使用塊移動至"空閑列表"。使得該塊可以被重新申請。
處理申請空間和釋放空間外,還實現了讀,寫,重新申請空間功能。
問題二:實現BTree
摘錄百科百科對BTree的描述:
B-tree(多路搜索樹,並不是二叉的)是一種常見的數據結構。使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。按照翻譯,B通常認為是Balance的簡稱。這個數據結構一般用於數據庫的索引,綜合效率較高。
http://baike.baidu.com/view/363832.htm
我們有了上面(問題一)的讀寫文件的功能,那么將B-tree建立到文件中去,和將之建立到內存,其實是一樣的。B-tree的內容在網上都可以找到。只不過在操作節點的內容時,我們可能要去讀寫文件。原來在內存中的指針,現在變成了在文件中的位置。
測試功能:
現在軟件實現了以下的功能,用於操作Key-value數據庫。在效率方面,寫1萬個數據大致在350ms吧,查找讀取的速度比寫快一倍左右;由於是直接寫硬盤,沒有緩存機制,效率也只能這樣。先把功能實現了再優化吧。
open( dbpath ) 打開一個數據庫
set( container, key, value ) 增加/設置一個Key
get( container, key ) 獲取一個Key的內容
del( container, key ) 刪除一個Key
close( ) 關閉一個數據庫