壹. 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)
{ ?
leveldb::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
string value = "陳其";
//寫
status = d B- & gt;Put(leveldb::WriteOptions()、key、value);
assert(status . ok());
//讀取
status = d B- & gt;Get(leveldb::ReadOptions()、key & amp;值);
assert(status . ok());
cout & lt& lt價值& lt& ltendl
//刪除
status = d B- & gt;Delete(leveldb::WriteOptions(),key);
assert(status . ok());
status = d B- & gt;Get(leveldb::ReadOptions()、key & amp;值);
如果(!status.ok()) {
cerr & lt& ltkey & lt& lt" " " & lt& lt狀態。ToString()& lt;& ltendl
}否則{
cout & lt& ltkey & lt& lt" = = = " & lt& lt價值& lt& ltendl
} ?
//關閉
刪除db;
返回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(leveldb::ReadOptions(),key1,& amp值);
if(s . ok())s = d B- & gt;Put(leveldb::WriteOptions(),key2,value);
if(s . ok())s = d B- & gt;Delete(leveldb::WriteOptions(),key 1);
第三,關閉數據庫
在對數據庫進行壹系列操作後,需要關閉數據庫。這個操作相對簡單:
...如上所述打開數據庫...
...對db做點什麽...
刪除db;
上面基本介紹了levelDB的簡單使用,接下來就是如何寫出壹個完整的、可操作的例子。
1,下載源代碼?git克隆/p/leveldb/
2.編譯源代碼?cd級& amp& 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 = d B- & gt;Put(leveldb::WriteOptions()、key、value);
assert(status . ok());
status = d B- & gt;Get(leveldb::ReadOptions()、key & amp;值);
assert(status . ok());
STD::cout & lt;& lt價值& lt& ltSTD::endl;
STD::string key 2 = " key 2 ";
//將key下的值移動到key2
status = d B- & gt;Put(leveldb::WriteOptions(),key2,value);
assert(status . ok());
status = d B- & gt;Delete(leveldb::WriteOptions(),key);
assert(status . ok());
status = d B- & gt;Get(leveldb::ReadOptions()、key 2 & amp;值);
assert(status . ok());
STD::cout & lt;& ltkey2 & lt& lt" = = = " & lt& lt價值& lt& ltSTD::endl;
status = d B- & gt;Get(leveldb::ReadOptions()、key & amp;值);
如果(!status . ok())STD::cerr & lt;& ltkey & lt& lt" " " & lt& lt狀態。ToString()& lt;& ltSTD::endl;
else STD::cout & lt;& ltkey & lt& lt" = = = " & lt& lt價值& lt& ltSTD::endl;
刪除db;
返回0;
}
4.編譯鏈接G++-otesttest.cpp../level db/libre veldb . a-LP thread-I../leveldb/include。
註意libleveldb.a和leveldb的路徑包括。
5.運行結果。/測試:
價值
key2 = = =值
找不到密鑰: