實現了一個簡單的key-value存儲系統

源碼下載:數據庫

  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( )            關閉一個數據庫指針

相關文章
相關標籤/搜索