天天看點

leveldb頭檔案的接口介紹

參考網址:http://www.aikaiyuan.com/7925.html

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,是以能保證寫入一緻性.