Google的NoSQL:leveldb入門知識
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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!