1. 程式人生 > >leveldb標頭檔案的介面介紹

leveldb標頭檔案的介面介紹

0、leveldb標頭檔案結構

include
└── leveldb
├── c.h => c binding
├── cache.h => cache介面
├── comparator.h => 比較器介面
├── db.h => DB介面
├── env.h => 為跨平臺準備的env介面
├── filter_policy.h => fliter策略,用於快取,請看到文件及相應實現
├── iterator.h => 迭代器,用於遍歷資料庫中儲存的資料
├── options.h => 包含控制資料庫的Options,控制讀的WriteOptions,ReadOptions
├── slice.h => Slice的介面
├── status.h => leveldb中大多介面返回的Status介面
├── table.h => immutable介面
├── table_builder.h => 用於建立table的構建器介面
└── write_batch.h => 使多個寫操作成為原子寫的介面

1、 c.h

leveldb為使用c程式碼提供了c bingding,為幾乎所有的c++介面都有對應的c函式。

2、cache.h

為了提高效能,使用LRU策略的Cache.如果使用自定義的cache方法,需要繼承Catch類,並實現其純虛擬函式。

3、comparator.h

Comparator提供了Comparator介面,用於比較key的大小,作為存放位置的參考.其介面定義也較為簡單.

4、db.h

db.h是使用leveldb時最經常include的標頭檔案.在這個標頭檔案中提供了DB的介面的定義,也是我們需要的部分.在db.h中,定義了Snapshot,Range,DB三個介面.Range為一個Slice對,定義了[start,end).符合C++的習慣.Snapshot為DB的某個特定狀態.由於其只讀,因此多執行緒訪問並不需要鎖.DB則提供了經常使用的幾個方法:

5、env.h

在env.h中,leveldb抽象了一層介面Env,將系統呼叫,檔案操作,檔案鎖,執行緒庫等系統呼叫進行了封裝,成為了Env.另外將檔案抽象成了RandomAccessFile,SequentialFile,WritableFile.這麼抽象的好處顯而易見: 跨平臺更為簡單.客戶端呼叫介面抽象出來的一致方法.使得不同平臺下的程式碼更為一致.而實現跨平臺也很簡單.無論是windows,還是*nix,甚至是android及ios,各個平臺只需要實現相應的方法就能完成port的工作.這種方式在開發跨平臺程式碼時很值得借鑑.
由於leveldb對於檔案介面使用的較多,所以env中有很多檔案操作的介面.除此之外還有執行緒,logger,時間等使用到的介面.檢視程式碼可以看出,其是龐大的系統呼叫中的一個非常的微小集合.

6、filter_policy.h

filter_policy.h中包含了FilterPolicy介面.由於leveldb的資料儲存在檔案中,因此一次Get請求可能會引起多次的讀操作.Filter的作用就在於通過空間換時間.當leveldb讀取某個key時,首先訪問filter,以判斷資料是否在sstable中.filter的資料儲存在記憶體中,訪問速度很高,同時也減少檔案IO,提高效率.leveldb提供了一個內建實現: BloomFilterPolicy.

7、iterator.h

在該標頭檔案中,聲明瞭Iterator介面.該介面主要用於遍歷資料庫中的資料.leveldb中有多個Iterator的實現,用於遍歷Table及Db中的資料.Iterator中的const方法是執行緒安全的(因為訪問該方法不改變資料),剩餘的方法在併發條件下需要加鎖.Iterator類似於c++中的iter,c++使用較多的朋友也肯定不會陌生.

8、options.h

options.h中給出了經常用到的三個Option: Options, ReadOptions, WriteOptions.

9、slice.h

在leveldb中,為了減少資料複製的負擔,對於需要傳遞字串的部分,都採用了Slice類.string雖然效能也很好,但是其實現有多種,在傳遞資料時仍然會發生資料拷貝.檢視下面的Slice宣告,就能發現Slice到底為什麼效能高,也為什麼會有坑.

10、status.h

status.h中包含了Status的宣告.Status是leveldb大多數函式呼叫的返回值.其作用類似於errno,只不過封裝的更為完善,也更為c++.Status的資料儲存在state_中.state_是一個長度至少為6的字串.前四位為message的length,第5位為status的狀態,再之後的為message.

11、table.h

talbe是一張按照key進行排序的map.其狀態為只讀.當用戶的寫超過一定數量時,leveldb將會生成一個table表.而後由後臺執行緒進行處理,生成sstable.放入磁碟中.具體內容在之後分析leveldb表的格式及原始碼時再進行了解.

12、tablebuilder.h

TableBuilder用於建立Table.

13、batch.h

WriteBatch為leveldb提供了原子修改的功能.呼叫者可以在一個batch中多次呼叫Put和Delete.而後通過db->Write將修改一次性寫入到資料庫中,而不必擔心寫到一半出現異常,從而導致資料庫資料不一致的狀態.作為功能類,WriteBatch的介面十分簡潔.僅僅提供了Put,Delete和Clear功能.同時提供了一個Handler,用於遍歷Batch中的資料.WriteBatch只有一個成員變數: string rep_.該變數是實現原子修改的關鍵.實際上,對於WriteBatch的Put,Delete,實際上都是對rep_的操作.在呼叫DB::Write時,DB將rep_的資料一次性寫入log中,而後將資料迭代存入到記憶體中.由於是一次性寫入log,因此能保證寫入一致性.