LevelDB簡介
壹。LevelDB簡介
LevelDB是Google開源的持久化KV獨立數據庫,具有較高的隨機寫入和順序讀取/寫入性能,但隨機讀取性能非常壹般,也就是說LevelDB非常適合查詢很少但寫入很多的場景。LevelDB采用LSM(日誌結構化合並)策略。lsm_tree延遲並批量處理索引更改,並以類似於合並排序的方式高效地將更新遷移到磁盤,從而減少索引插入開銷。關於LSM,本文稍後也將簡要提及。
根據LevelDB官方網站的描述,LevelDB的特點和局限性如下:
特點:
1,key和值是任意長度的字節數組;
2.默認情況下,條目(即K-V記錄)按照key的字典順序存儲。當然,開發人員也可以重載這個排序函數。
3.提供的基本操作接口:Put()、Delete()、Get()、batch();
4.支持原子操作批量操作;
5.您可以創建數據全景的快照,並允許您在快照中查找數據;
6.您可以通過正向(或反向)叠代器遍歷數據(叠代器將隱式創建快照);
7.自動使用Snappy壓縮數據;
8.便攜性;
限制:
1,非關系數據模型(Nosql),不支持sql語句或索引;
2.壹次只允許壹個進程訪問特定的數據庫;
3.沒有內置的C/S架構,但開發人員可以使用LevelDB庫來打包服務器。
LevelDB本身只是壹個lib庫,它可以在源目錄make中編譯,然後包含leveldb/include/db.h頭文件可以直接包含在我們的應用程序中。頭文件有幾個基本的數據庫操作接口,下面是壹個測試示例:
# include & ltiostream & gt
# include & lt字符串& gt
# include & ltassert.h & gt
#包含“leveldb/db.h“
使用命名空間std
int main(void)
{
level DB::DB * DB;
leveldb::Options選項;
options . create _ if _ missing = true;
//打開
level DB::Status Status = level DB::DB::Open(options“/tmp/testdb“,& ampdb);
assert(status . ok());
string key =“name“;
字符串值=“陳其“;
//寫入
status = db-& gt;put(level db::write options(),key,value);
assert(status . ok());
//讀取
status = db-& gt;get(level db::read options()、key & amp;值);
assert(status . ok());
cout & lt& lt價值& lt& ltendl
//刪除
status = db-& gt;delete(level db::write options(),key);
assert(status . ok());
status = db-& gt;get(level db::read options()、key & amp;值);
如果(!status.ok())
cerr & lt& ltkey & lt& lt“““& lt& lt狀態。ToString()& lt;& ltendl
}否則{
cout & lt& ltkey & lt& lt“= = =“& lt;& lt價值& lt& ltendl
}
//關閉
刪除數據庫;
返回0;
}
上面的示例演示了如何插入、獲取和刪除記錄以及編譯代碼:
g++-o test test . CPP libleveldb . a-LP thread-Iinclude
執行後。/test,將在/tmp下生成壹個目錄testdb,其中包含幾個文件:
-
LevelDB是google的壹個開源鍵值存儲引擎庫,類似於開源的Lucene索引庫。其他軟件開發人員可以使用該庫進行二次開發,以滿足定制需求。LevelDB使用日誌寫入來提高寫入性能,但犧牲了壹些讀取性能。為了彌補犧牲的讀取性能,有人提議使用SSD作為存儲介質。
對於本地化的鍵值存儲引擎,簡單使用壹般分為三個基本步驟:(1)打開數據庫實例;(2)插入、修改和查詢該數據庫實例;(3)最後,使用完成後,關閉數據庫。下面將詳細討論這三個步驟:
首先,打開壹個數據庫實例
leveldb數據庫的名稱與文件系統目錄相對應。數據庫的所有內容都存儲在這個目錄中。以下代碼描述了如何打開數據庫或創建新數據庫。
# include & ltassert.h & gt
#包含“leveldb/db.h“
level DB::DB * DB;
leveldb::Options選項;
options . create _ if _ missing = true;
level DB::Status Status = level DB::DB::Open(options“/tmp/testdb“,& ampdb);
assert(status . ok());
如果妳打開壹個現有的數據庫,妳需要拋出壹個錯誤。在leveldb::DB::Open方法之前插入以下代碼:
options.error _ if _ exists = true
第二,簡單的數據庫讀寫操作
LevelDB提供了三種方法:Put、Delete和Get來修改和查詢數據庫。例如,下面的代碼片段描述了如何將對應於key1的值移動到對應於key2的值。
std::字符串值;
level db::Status s = d B- & gt;get(level db::read options(),key1,& amp值);
if(s . ok()s = db-& gt;put(level db::write options(),key2,value);
if(s . ok()s = db-& gt;delete(level db::write options(),key 1);
第三,關閉數據庫
在對數據庫進行壹系列操作後,需要關閉數據庫。這個操作相對簡單:
...如上所述打開數據庫...
...對db做點什麽...
刪除數據庫;
上面基本介紹了levelDB的簡單使用方法,下壹步是如何編寫壹個完整且可操作的示例。
1,下載源git clone /p/leveldb/
2.編譯源代碼CD級DB &;& amp全部制作
3.編寫test.cpp
# include & ltassert.h & gt
# include & ltstring.h & gt
# include & ltlevel db/db . h & gt;
# include & ltiostream & gt
int main(){
level DB::DB * DB;
leveldb::Options選項;
options . create _ if _ missing = true;
level DB::Status Status = level DB::DB::Open(options“/tmp/testdb“,& ampdb);
assert(status . ok());
//寫key1,value1
STD::string key =“key“;
STD::string value =“value“;
status = db-& gt;put(level db::write options(),key,value);
assert(status . ok());
status = db-& gt;get(level db::read options()、key & amp;值);
assert(status . ok());
std::cout<。& lt價值& lt& ltSTD::endl;
STD::string key 2 =“key 2“;
//將key下的值移動到key2
status = db-& gt;put(level db::write options(),key2,value);
assert(status . ok());
status = db-& gt;delete(level db::write options(),key);
assert(status . ok());
status = db-& gt;get(level db::read options()、key 2 & amp;值);
assert(status . ok());
std::cout<。& ltkey2 & lt& lt“= = =“& lt;& lt價值& lt& ltSTD::endl;
status = db-& gt;get(level db::read options()、key & amp;值);
如果(!status . ok()STD::cerr & lt;& ltkey & lt& lt“““& lt& lt狀態。ToString()& lt;& ltSTD::endl;
else std::cout<。& ltkey & lt& lt“= = =“& lt;& lt價值& lt& ltSTD::endl;
刪除數據庫;
返回0;
}
4.編譯鏈接G++-otesttest.cpp../level db/libre vel db . a-LP thread-I../leveldb/include。
註意libleveldb.a和leveldb的路徑包括。
5.運行結果。/測試:
價值
key2 = = =值
未找到密鑰: