LevelDB:使用介紹

LevelDB 提供的接口其實(shí)很簡(jiǎn)單,下面舉例進(jìn)行簡(jiǎn)單說(shuō)明。

例子

#include <iostream>
#include <cassert>
#include "leveldb/db.h"
#include "leveldb/write_batch.h"

int main()
{
    // Open a database.
    leveldb::DB* db;
    leveldb::Options opts;
    opts.create_if_missing = true;
    leveldb::Status status = leveldb::DB::Open(opts, "./testdb", &db);
    assert(status.ok());
    
    // Write data.
    status = db->Put(leveldb::WriteOptions(), "name", "jinhelin");
    assert(status.ok());

    // Read data.
    std::string val;
    status = db->Get(leveldb::ReadOptions(), "name", &val);
    assert(status.ok());
    std::cout << val << std::endl;

    // Batch atomic write.
    leveldb::WriteBatch batch;
    batch.Delete("name");
    batch.Put("name0", "jinhelin0");
    batch.Put("name1", "jinhelin1");
    batch.Put("name2", "jinhelin2");
    batch.Put("name3", "jinhelin3");
    batch.Put("name4", "jinhelin4");
    batch.Put("name5", "jinhelin5");
    batch.Put("name6", "jinhelin6");
    batch.Put("name7", "jinhelin7");
    batch.Put("name8", "jinhelin8");
    batch.Put("name9", "jinhelin9");
    status = db->Write(leveldb::WriteOptions(), &batch);
    assert(status.ok());

    // Scan database.
    leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok());
    
    // Range scan, example: [name3, name8)
    for (it->Seek("name3"); 
         it->Valid() && it->key().ToString() < "name8"; 
         it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    } 

    // Close a database.
    delete db;
}

這個(gè)例子簡(jiǎn)單介紹了 LevelDB 的基本用法,包括:

  1. 打開(kāi)數(shù)據(jù)庫(kù)。
  2. 寫(xiě)入一條數(shù)據(jù)。
  3. 讀取一條數(shù)據(jù)。
  4. 批量原子操作。
  5. 范圍查找。
  6. 關(guān)閉數(shù)據(jù)庫(kù)。

打開(kāi)數(shù)據(jù)庫(kù)

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

打開(kāi) LevelDB 數(shù)據(jù)庫(kù)需要三個(gè)參數(shù):

  • leveldb::Options :控制 DB 行為的一些參數(shù),具體可以參考鏈接指向的代碼。在這里 create_if_missingtrue 表示如果數(shù)據(jù)庫(kù)./testdb 存在就直接打開(kāi),不存在就創(chuàng)建。
  • ./testdb :LevelDB 數(shù)據(jù)庫(kù)的根目錄。一個(gè) LevelDB 數(shù)據(jù)庫(kù)存放在一個(gè)目錄下。
  • &db :用來(lái)返回一個(gè) LevelDB 實(shí)例。
  • leveldb::Status :封裝了 leveldb 接口返回的詳細(xì)信息。

寫(xiě)入一條數(shù)據(jù)

    ...
    // Write data.
    status = db->Put(leveldb::WriteOptions(), "name", "jinhelin");
    assert(status.ok());
    ...

Put 接口的三個(gè)參數(shù):

  • leveldb::WriteOptions :目前里面只有一個(gè) sync 成員。表示寫(xiě)完 WAL 后是否需要 flush。
  • 另外兩個(gè)參數(shù)分別是本次寫(xiě)入數(shù)據(jù)的 Key 和 Value。

讀取一條數(shù)據(jù)

    ...
    // Read data.
    std::string val;
    status = db->Get(leveldb::ReadOptions(), "name", &val);
    assert(status.ok());
    std::cout << val << std::endl;
    ...

Get 接口和 Put 接口比較像,除了 leveldb::ReadOptions 參數(shù)是用來(lái)控制讀操作的,具體見(jiàn)鏈接指向的代碼。

批量原子修改

    ...
    // Batch atomic write.
    leveldb::WriteBatch batch;
    batch.Delete("name");
    batch.Put("name0", "jinhelin0");
    batch.Put("name1", "jinhelin1");
    batch.Put("name2", "jinhelin2");
    batch.Put("name3", "jinhelin3");
    batch.Put("name4", "jinhelin4");
    batch.Put("name5", "jinhelin5");
    batch.Put("name6", "jinhelin6");
    batch.Put("name7", "jinhelin7");
    batch.Put("name8", "jinhelin8");
    batch.Put("name9", "jinhelin9");
    status = db->Write(leveldb::WriteOptions(), &batch);
    assert(status.ok());
    ...

LevelDB 的 Write 接口支持原子地修改多條數(shù)據(jù),主要參數(shù)是 leveldb::WriteBatch 。

范圍查找

    ...
    // Scan database.
    leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    assert(it->status().ok());
    
    // Range scan, example: [name3, name8)
    for (it->Seek("name3"); 
         it->Valid() && it->key().ToString() < "name8"; 
         it->Next()) {
        std::cout << it->key().ToString() << ": " << 
          it->value().ToString() << std::endl;
    }
    ...

LevelDB 通過(guò)提供 leveldb::Iterator 來(lái)實(shí)現(xiàn)范圍查找。

關(guān)閉數(shù)據(jù)庫(kù)

    ...
    // Close a database.
    delete db;
    ...

最后,關(guān)閉數(shù)據(jù)庫(kù)時(shí)需要?jiǎng)h除掉創(chuàng)建的數(shù)據(jù)庫(kù)實(shí)例,讓其調(diào)用析構(gòu)函數(shù)處理一些收尾工作。

Snapshot

LevelDB 還提供了快照(Snapshot)的功能,讓?xiě)?yīng)用可以獲得數(shù)據(jù)庫(kù)在某一時(shí)刻的只讀的一致性數(shù)據(jù)??梢岳?LevelDB 的 Snapshot 功能實(shí)現(xiàn)類似 MySQL 的 MVCC。

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,688評(píng)論 18 399
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,399評(píng)論 22 257
  • 你說(shuō)明天天氣不錯(cuò) 可我不能陪你出去旅游 你說(shuō)最近心里比較煩 我只陪你聊到深夜,別的什么也做不了 你說(shuō)想吃橘子了 我...
    酥白閱讀 182評(píng)論 0 3
  • 同事推薦的,聽(tīng)說(shuō)很不錯(cuò),下載下來(lái)試著用一下!希望能看到不錯(cuò)的東西
    無(wú)為之殤閱讀 258評(píng)論 0 0

友情鏈接更多精彩內(nèi)容