[LevelDB] 編譯和使用


一、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 #include "leveldb/db.h"
 2 #include <cassert>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 using namespace leveldb;
 7 
 8 int main()
 9 {
10     leveldb::DB *db;
11     leveldb::Options options;
12     options.create_if_missing = true;
13     leveldb::Status status = leveldb::DB::Open(options, "testdb", &db);
14     assert(status.ok());
15 
16     status = db->Put(WriteOptions(), "YM65536", "Hello ym65536!");
17     assert(status.ok());
18     string res;
19     status = db->Get(ReadOptions(), "YM65536", &res);
20     assert(status.ok());
21     cout << res << endl;
22 
23     delete db;
24     return 0;
25 }

編譯運行

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有關的

文檔, 編譯, 源代碼三合一, 干凈利落。


免責聲明!

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



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