レベルの紹介と使用方法

レベルデータベースの紹介

LevelDB は、高速な永続ストレージを提供するために Google によって開発されたオープンソースの Key-Value ストアです。LevelDB は、基礎となるストレージ構造として B ツリーを使用し、データの効率的な書き込み、更新、読み取りをサポートします。複数の同時読み取り操作と単一の書き込み操作をサポートしているため、同時実行性の高いアプリケーションに最適です。LevelDB は、Linux、Windows、Mac OS X などの複数のプラットフォームで実行でき、C++、Java、Python、Node.js などの複数のプログラミング言語で API を提供するため、開発者はそれを独自のプラットフォームに簡単に統合できます。アプリケーションで。LevelDB は、分散ストレージ、キャッシュ、ログ ストレージなどのさまざまなアプリケーション シナリオで広く使用されています。

1. leveldb をダウンロードしてコンパイルします。

    git clone https://github.com/google/leveldb
    cmake -Bbuild_ninja -DCMAKE_INSTALL_PREFIX=`pwd`/install
    cmake --build build_ninja

2. Leveldb インターフェースの紹介

    // 打开数据库
    Status DB::Open(const Options& options, const std::string& dbname, DB** dbptr);
  // 添加/修改 数据
    Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value)
    // 查询数据
    Status DBImpl::Get(const ReadOptions& options, const Slice& key,
  std::string* value);
  // 删除数据
  Status DB::Delete(const WriteOptions& opt, const Slice& key) 

3.leveldbインターフェースを使用する

    #include <leveldb/db.h>
    
    enum DbStatus{
    DB_Error_UnKnown = -1,
    DB_OK = 0,
    DB_Error_NotFound = 1,
    DB_Error_Corruption = 2,
    DB_Error_NotSupported = 3,
    DB_Error_InvalidArgument = 4,
    DB_Error_IOError = 5
};

    
    class LevelMaria{
    public:
        explicit LevelMaria(){}

        void OpenDB(const std::string& dbpath){
            leveldb::Options options;
            options.create_if_missing = true;
            leveldb::Status status = leveldb::DB::Open(options, dbpath, &_db);
            if (!status.ok())
                spdlog::info("open level db:{0} error:{1}", dbpath, status.ToString());
            assert(status.ok());
        }

        void CloseDB(){
            if(_db){
                delete _db;
            }
        }

        //put
        DbStatus Put(const std::string &key, const std::string& value){
            return DbStatus(_db->Put(leveldb::WriteOptions(), key, value).ErrorCode());
        }

        //get
        DbStatus Get(const std::string &key, std::string &value){
            return DbStatus(_db->Get(leveldb::ReadOptions(), key, &value).ErrorCode());
        }

        //delete
        DbStatus Delete(const std::string &key){
            return DbStatus(_db->Delete(leveldb::WriteOptions(), key).ErrorCode());
        }

        //read all
        void ReadAll(){
            leveldb::Iterator* it = _db->NewIterator(leveldb::ReadOptions());
            for (it->SeekToFirst(); it->Valid(); it->Next()) {
                spdlog::info("key:{0} value:{1}", it->key().ToString() , it->value().ToString());
            }     
            assert(it->status().ok());  // Check for any errors found during the scan
            delete it;
        }


    private:
        leveldb::DB *_db{nullptr};
};

4. テスト通話

#include <iostream>
#include <sstream>

std::string time_string(std::time_t posix){
    char bq[20];
    std::tm tp = *std::localtime(&posix);
    return {bq, std::strftime(bq, sizeof(bq), "%F %T", &tp)};
}

std::string timeusec(){
    auto now = std::chrono::system_clock::now();
    auto us = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch())%1000000;
    std::ostringstream ss;
    ss.fill('0');
    ss << time_string(std::chrono::system_clock::to_time_t(now)) << '.' << us.count();
    return ss.str();
}

int main(){
      LevelMaria lma;
    lma.OpenDB("monitor_level.db");

    for(int i = 0; i < 5; i++){
        #ifdef _WIN32
        Sleep(1);
        #else
        usleep(1);
        #endif
        lma.Put(timeusec(), std::to_string(i));
    }

    lma.ReadAll();
    lma.CloseDB();
}

おすすめ

転載: blog.csdn.net/CHNIM/article/details/132151824