源碼下載:數據庫
kvfs.rar緩存
正文:數據結構
所謂的Key-Value就是每次存儲一個數據時,是根據Key進行索引存儲的。爲了實現Key的快速查找功能,我使用了B-tree存儲結構。B-tree被大量用於數據庫的索引中,因此選用B-tree想必不會有太大的問題。Value是對應該Key的值,他的長度是未知的,因此要實現這樣一個存儲系統,必需要解決從Key值到文件位置的映射關係。測試
問題一:實現文件的"自由"讀寫
問題二:實現BTree優化
問題一:實現文件的"自由"讀寫。
基本思想:全部內容被存儲到一個文件中,文件被劃分紅同一大小的粒度,能夠自由的申請不一樣的大小空間,能夠釋放已經申請的空間。使得文件操做能夠和內存操做接口一致。
基於上述的需求,個人文件存儲結構以下圖所示:
atom
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. 將使用塊移動至"空閒列表"。使得該塊能夠被從新申請。
處理申請空間和釋放空間外,還實現了讀,寫,從新申請空間功能。
spa
問題二:實現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( ) 關閉一個數據庫指針