zoukankan      html  css  js  c++  java
  • 使用leveldb

    C++引入leveldb

    编译安装:

    git clone --recurse-submodules https://github.com/google/leveldb.git
    cd leveldb
    mkdir -p build && cd build
    cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
    sudo make install
    

    C++工程引入leveldb库,需链接-lleveldb -lpthread

    leveldb使用示例

    #include <iostream>
    #include <leveldb/db.h>
    
    int main(int argc, char const *argv[])
    {
        leveldb::DB* db;
        leveldb::Options options;
        options.create_if_missing = true;
        leveldb::Status status = leveldb::DB::Open(options, "testdb", &db);
        if (!status.ok()) {
            std::cout << "open db failed" << std::endl;
            return -1;
        }
        std::cout << "open db success" << std::endl;
        status = db->Put(leveldb::WriteOptions(), "rc", "Hello rc!");
        if (!status.ok()) {
            std::cout << "put db failed" << std::endl;
            return -1;
        }
        std::cout << "put db success" << std::endl;
        std::string res;
        status = db->Get(leveldb::ReadOptions(), "rc", &res);
        if (!status.ok()) {
            std::cout << "get db failed" << std::endl;
            return -1;
        }
        std::cout << "get db success" << std::endl;
    
        std::cout << "get " << res << std::endl;
        delete db;
    
        return 0;
    }
    

    options选项含义

     struct Options {
         const Comparator* comparator;                    // 用来决定key在表中的排列顺序,默认按字典序存放
         bool create_if_missing = false;                  // 为true表示数据库不存在则创建,否则会报错
         bool error_if_exists = false;                    // 为true表示数据库存在则报错
         bool paranoid_checks = false;                    // 为true表示,严格检错模式,出错后可能会导致数据库不可用
         Env* env;                                        // 平台兼容性相关,默认为Env::Default()
         Logger* info_log = nullptr;                      // 为null则日志信息和数据内容写在同一个文件,否则单独写到info_log文件
         size_t write_buffer_size = 4 * 1024 * 1024;      // 大的写缓存可以提升性能,特别是大块数据加载的时候,但会增加内存占用,降低数据库打开速度
         int max_open_files = 1000;                       // 数据库最多能打开的文件数
         Cache* block_cache = nullptr;                    // 缓存块总的大小,为null则使用内部的8MB缓存块
         size_t block_size = 4 * 1024;                    // 缓存块的大小,大缓存块可以提升大块扫描的性能,也能提升压缩性能
         size_t max_file_size = 2 * 1024 * 1024;          // leveldb最大写文件的大小,达到该值将创建新的文件
         CompressionType compression = kSnappyCompression;// 压缩算法,kSnappyCompression或KNoCompression
         bool reuse_logs = false;                         // 为true的话,会采用追加模式写manifest和log,可以提升数据库开启速度
         const FilterPolicy* filter_policy = nullptr;     // 如果用NewBloomFilterPolicy可以减少磁盘读取次数,但是会增加内存占用
     }
    
     struct ReadOptions {
         bool verify_checksums = false;                   // 是否对查询出的数据做校验和运算
         bool fill_cache = true;                          // 是否缓存这次查询结果(如果是做大块数据的扫描/遍历,那么最好设为false)
         const Snapshot* snapshot = nullptr;              // 指定从哪次快照中执行查询,为null则表示最新的状态查询
     }
    
     struct WriteOptions {
         // 是否用同步的方式写入,若为true写入操作将会阻塞到数据成功存储到文件中
         // 若为false,则机器崩溃后可能会丢失最近写入的数据
         // 但如果只是程序崩溃,不是机器reboot,那么即使为false也不会丢失最近写入的数据
         bool sync = false;
     }
    

    status错误代码

    class Status {
    public:
        // 运行成功
        bool ok() const;
        // 未找到错误
        bool IsNotFound() const;
        // 崩溃错误
        bool IsCorruption() const
        // IO错误
        bool IsIOError() const;
        // 不支持错误
        bool IsNotSupportedError() const;
        // 参数非法错误
        bool IsInvalidArgument() const;
    };
    

    Slice

    Slice可以和string和char*类型相互转换,这里为了减少数据拷贝,Slice只保存传入的字符串的指针,所以string转换为Slice需要注意string对象的生存周期

    class Slice {
    public:
        Slice(const char* s) : data_(s), size_(strlen(s)) {}
        Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
        std::string ToString() const { return std::string(data_, size_); }
        const char* data() const { return data_; }
    private:
        const char* data_;
        size_t size_;
    };
    
  • 相关阅读:
    【[CQOI2015]选数】
    杜教筛
    【[CQOI2009]跳舞】
    【简单的数学题】
    【[SDOI2013]泉】
    【[AHOI2013]差异】
    【[HEOI2016/TJOI2016]序列】
    【[SDOI2008]Sandy的卡片】
    linux系统编程之信号(一)
    linux系统编程之进程(五)
  • 原文地址:https://www.cnblogs.com/HachikoT/p/12748669.html
Copyright © 2011-2022 走看看