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


源碼下載:

  kvfs.rar

正文:

  所謂的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( )            關閉一個數據庫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM