[leveldb]0.源碼編譯及使用

1、LevelDB簡介ios

LevelDB是Google開源的持久化KV單機數據庫,具備很高的隨機寫,順序讀/寫性能,可是隨機讀的性能很通常,也就是說,LevelDB很適合應用在查詢較少,而寫不少的場景。LevelDB應用了LSM (Log Structured Merge) 策略,lsm_tree對索引變動進行延遲及批量處理,並經過一種相似於歸併排序的方式高效地將更新遷移到磁盤,下降索引插入開銷,關於LSM,本文在後面也會簡單說起。git

 

根據Leveldb官方網站的描述,LevelDB的特色和限制以下:程序員

特色:
一、key和value都是任意長度的字節數組;
二、entry(即一條K-V記錄)默認是按照key的字典順序存儲的,固然開發者也能夠重載這個排序函數;
三、提供的基本操做接口:Put()、Delete()、Get()、Batch();
四、支持批量操做以原子操做進行;
五、能夠建立數據全景的snapshot(快照),並容許在快照中查找數據;
六、能夠經過前向(或後向)迭代器遍歷數據(迭代器會隱含的建立一個snapshot);
七、自動使用Snappy壓縮數據;
八、可移植性;github

限制:
一、非關係型數據模型(NoSQL),不支持sql語句,也不支持索引;
二、一次只容許一個進程訪問一個特定的數據庫;
三、沒有內置的C/S架構,但開發者可使用LevelDB庫本身封裝一個server;sql

2、下載編譯數據庫

LevelDB源碼託管在github上,下載以下:ubuntu

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 }

編譯運行app

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!

 

3、LevelDB 代碼結構分析

 LevelDB的項目結構是至關扁平化的, 目錄沒超過3級的, 好像C/C++程序員都喜歡都這樣. Redis也是源碼一大票文件都在src下. 我我的是偏Java那種, 要分好多級的. 這個也能夠學習下, 代碼之間原本就是高度複用的, 強行劃分紅各類"優美"的小塊, 反而下降了質量.

  • db/, 數據庫邏輯
  • doc/, MD文檔
  • helpers/, LevelDB內存版, 經過namespace覆蓋
  • port/, 平臺相關代碼
  • table/, LSM有關的

文檔, 編譯, 源代碼三合一, 乾淨利落。

相關文章
相關標籤/搜索