level介绍与使用

leveldb介绍

LevelDB是一个开源的键值存储库,由Google开发,用于提供快速的持久化存储。LevelDB使用B树作为底层存储结构,支持高效地写入、更新和读取数据。它支持多个并发读取操作和单个写操作,因此非常适合用于高并发的应用程序。LevelDB可以在Linux、Windows和Mac OS X等多个平台上运行,并提供了多种编程语言的API,如C++、Java、Python、Node.js等,使得开发者可以轻松地将其集成到自己的应用程序中。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 
    
    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 
#include 

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(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();
}

你可能感兴趣的:(C++基础实战,c++,leveldb)