一、LevelDB簡介
LevelDB是Google開源的持久化KV單機數據庫,具有很高的隨機寫,順序讀/寫性能,但是隨機讀的性能很一般,也就是說,LevelDB很適合應用在查詢較少,而寫很多的場景。LevelDB應用了LSM (Log Structured Merge) 策略,lsm_tree對索引變更進行延遲及批量處理,並通過一種類似於歸並排序的方式高效地將更新遷移到磁盤,降低索引插入開銷,關於LSM,本文在后面也會簡單提及。
根據Leveldb官方網站的描述,LevelDB的特點和限制如下:
特點:
1、key和value都是任意長度的字節數組;
2、entry(即一條K-V記錄)默認是按照key的字典順序存儲的,當然開發者也可以重載這個排序函數;
3、提供的基本操作接口:Put()、Delete()、Get()、Batch();
4、支持批量操作以原子操作進行;
5、可以創建數據全景的snapshot(快照),並允許在快照中查找數據;
6、可以通過前向(或后向)迭代器遍歷數據(迭代器會隱含的創建一個snapshot);
7、自動使用Snappy壓縮數據;
8、可移植性;
限制:
1、非關系型數據模型(NoSQL),不支持sql語句,也不支持索引;
2、一次只允許一個進程訪問一個特定的數據庫;
3、沒有內置的C/S架構,但開發者可以使用LevelDB庫自己封裝一個server;
二、下載編譯
LevelDB源碼托管在github上,下載如下:
1 git clone https://github.com/google/leveldb.git 2 cd leveldb 3 make
編譯過程中沒有error的話, 會在根目錄看到兩個新文件夾, out-shared和out-static, 分別對應動態庫和靜態庫版本. LevelDB雖然叫DB, 其實是個庫.
下面開始使用leveldb庫。創建文件leveldb_test.cpp:
編譯運行
1 root@ubuntu:test# g++ -g -o leveldb_test leveldb_test.cpp ../leveldb/out-static/libleveldb.a -lpthread -I../leveldb/include/
2 root@ubuntu:test# ./leveldb_test
3 Hello ym6536!
三、LevelDB 代碼結構分析
LevelDB的項目結構是相當扁平化的, 目錄沒超過3級的, 好像C/C++程序員都喜歡都這樣. Redis也是源碼一大票文件都在src下. 我個人是偏Java那種, 要分好多級的. 這個也可以學習下, 代碼之間本來就是高度復用的, 強行划分成各種"優美"的小塊, 反而降低了質量.
- db/, 數據庫邏輯
- doc/, MD文檔
- helpers/, LevelDB內存版, 通過namespace覆蓋
- port/, 平台相關代碼
- table/, LSM有關的
文檔, 編譯, 源代碼三合一, 干凈利落。