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那種, 要分好多級的. 這個也能夠學習下, 代碼之間原本就是高度複用的, 強行劃分紅各類"優美"的小塊, 反而下降了質量.
文檔, 編譯, 源代碼三合一, 乾淨利落。