Google的NoSQL:leveldb入門知識

jopen 12年前發布 | 23K 次閱讀 leveldb NoSQL數據庫

LevelDB是google開源的一個key-value存儲引擎庫,類似于開源的Lucene索引庫一樣。其他的軟件開發者可以利用該庫做二次開發,來滿足定制需求。LevelDB采用日志式的寫方式來提高寫性能,但是犧牲了部分讀性能。為了彌補犧牲了的讀性能,一些人提議使用SSD作為存儲介質。

對于本地化的Key-value存儲引擎來說,簡單的使用一般都分成三個基本的步驟:(1)打開一個數據庫實例;(2)對這個數據庫實例進行插入,修改和查詢操作;(3)最后在使用完成之后,關閉該數據庫。下面將詳細討論該三個步驟:

一、打開一個數據庫實例
一個leveldb數據庫有一個對應一個文件系統目錄的名字。該數據庫的所有內容都存儲在這個目錄下。下面的代碼描述了怎樣打開一個數據庫或者建立一個新的數據庫。
#include <assert.h>    
#include "leveldb/db.h"    

leveldb::DB* db;    
leveldb::Options options;    
options.create_if_missing = true;    
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);    
assert(status.ok());    

如果打開已存在數據庫的時候,需要拋出錯誤。將以下代碼插在leveldb::DB::Open方法前面:    
options.error_if_exists = true;   

二、對數據庫的簡單讀、寫操作
LevelDB提供了Put,Delete和Get三個方法對數據庫進行修改和查詢。例如,下面的代碼片段描述了怎樣將key1對應的value值,移到key2對應的值。
std::string value;    
leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);    
if(s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);    
if(s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);    

三、關閉數據庫
在對數據庫進行了一系列的操作之后,需要對數據庫進行關閉。該操作比較簡單:
... open the db as described above...    
... do something with db ...    
delete db;   

上面對levelDB的簡單使用做了基本的介紹,接下來就是如何自己寫一個完成并且能運行的例子。
1、下載源碼  git clone https://code.google.com/p/leveldb/
2、編譯源碼  cd leveldb && make all
3、編寫test.cpp
#include <assert.h>    
#include <string.h>    
#include <leveldb/db.h>    
#include <iostream>    

int main(){    
        leveldb::DB* db;    
        leveldb::Options options;    
        options.create_if_missing = true;    
        leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", &db);    
        assert(status.ok());    

        //write key1,value1    
        std::string key="key";    
        std::string value = "value";    

        status = db->Put(leveldb::WriteOptions(), key,value);    
        assert(status.ok());    

        status = db->Get(leveldb::ReadOptions(), key, &value);    
        assert(status.ok());    
        std::cout<<value<<std::endl;    
        std::string key2 = "key2";    

        //move the value under key to key2    

        status = db->Put(leveldb::WriteOptions(),key2,value);    
        assert(status.ok());    
        status = db->Delete(leveldb::WriteOptions(), key);    

        assert(status.ok());    

        status = db->Get(leveldb::ReadOptions(),key2, &value);    

        assert(status.ok());    
        std::cout<<key2<<"==="<<value<<std::endl;    

        status = db->Get(leveldb::ReadOptions(),key, &value);    

        if(!status.ok()) std::cerr<<key<<"    "<<status.ToString()<<std::endl;    
        else std::cout<<key<<"==="<<value<<std::endl;    

        delete db;    
        return 0;    
}    

4、編譯鏈接 g++ -o test test.cpp ../leveldb/libleveldb.a -lpthread -I../leveldb/include
     注意libleveldb.a 和leveldb include的路徑。
5、運行結果./test:
value    
key2===value    
key    NotFound:

來自:http://my.oschina.net/u/590043/blog/80024
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!