怎樣操作leveldb資料庫,實現增刪改查?


http://www.bubuko.com/infodetail-411090.html 摘錄一段給你

LevelDB 簡介

一、LevelDB入門

LevelDB是Google開源的持久化KV單機資料庫,具有很高的隨機寫,順序讀/寫性能,但是隨機讀的性能很一般,也就是說,LevelDB很適合應用在查詢較少,而寫很多的場景。LevelDB應用了LSM (Log Structured Merge) 策略,lsm_tree對索引變更進行延遲及批量處理,並通過一種類似於歸併排序的方式高效地將更新遷移到磁碟,降低索引插入開銷,關於LSM,本文在後面也會簡單提及。

根據LevelDB官方網站的描述,LevelDB的特點和限制如下:

特點:

1、key和value都是任意長度的位元組數組;

2、entry(即一條K-V記錄)默認是按照key的字典順序存儲的,當然開發者也可以重載這個排序函數;

3、提供的基本操作介面:Put()、Delete()、Get()、Batch();

4、支持批量操作以原子操作進行;

5、可以創建數據全景的snapshot(快照),並允許在快照中查找數據;

6、可以通過前向(或後向)迭代器遍曆數據(迭代器會隱含的創建一個snapshot);

7、自動使用Snappy壓縮數據;

8、可移植性;

限制:

1、非關係型數據模型(NoSQL),不支持sql語句,也不支持索引;

2、一次只允許一個進程訪問一個特定的資料庫;

3、沒有內置的C/S架構,但開發者可以使用LevelDB庫自己封裝一個server;

LevelDB本身只是一個lib庫,在源碼目錄make編譯即可,然後在我們的應用程序裡面可以直接include leveldb/include/db.h頭文件,該頭文件有幾個基本的資料庫操作介面,下面是一個測試例子:

#include &
#include &
#include &
#include "leveldb/db.h"

using namespace std;

int main(void)
{

leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;

// open
leveldb::Status status = leveldb::DB::Open(options,"/tmp/testdb", db);
assert(status.ok());

string key = "name";
string value = "chenqi";

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

// read
status = db-&>Get(leveldb::ReadOptions(), key, value);
assert(status.ok());

cout&<&Delete(leveldb::WriteOptions(), key);
assert(status.ok());

status = db-&>Get(leveldb::ReadOptions(),key, value);
if(!status.ok()) {
cerr&<&

上面的例子演示了如何插入、獲取、刪除一條記錄,編譯代碼:

g++ -o test test.cpp libleveldb.a -lpthread -Iinclude

執行./test後,會在/tmp下面生成一個目錄testdb,裡面包含若干文件:

------------------------------

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

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

一、打開一個資料庫實例

一個leveldb資料庫有一個對應一個文件系統目錄的名字。該資料庫的所有內容都存儲在這個目錄下。下面的代碼描述了怎樣打開一個資料庫或者建立一個新的資料庫。

#include &
#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 &
#include &
#include &
#include &

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&<&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&<&Get(leveldb::ReadOptions(),key, value);

if(!status.ok()) std::cerr&<&

4、編譯鏈接 g++ -o test test.cpp ../leveldb/libleveldb.a -lpthread -I../leveldb/include

注意libleveldb.a 和leveldb include的路徑。

5、運行結果./test:

value
key2===value
key NotFound:


Put delete


推薦閱讀:

終於等到你——MySQL 5.7與PostgreSQL 9.6的百萬QPS大比拼
如何實現基於 follow 關係的 timeline?
如何安裝與連接MySQL?
基於知乎用戶數據的基礎MySQL使用指南
時間序列資料庫漫談

TAG:資料庫 | 程序員 | LevelDB |