C++引入leveldb

编译安装:

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

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

leveldb使用示例

  1. #include <iostream>
  2. #include <leveldb/db.h>
  3. int main(int argc, char const *argv[])
  4. {
  5. leveldb::DB* db;
  6. leveldb::Options options;
  7. options.create_if_missing = true;
  8. leveldb::Status status = leveldb::DB::Open(options, "testdb", &db);
  9. if (!status.ok()) {
  10. std::cout << "open db failed" << std::endl;
  11. return -1;
  12. }
  13. std::cout << "open db success" << std::endl;
  14. status = db->Put(leveldb::WriteOptions(), "rc", "Hello rc!");
  15. if (!status.ok()) {
  16. std::cout << "put db failed" << std::endl;
  17. return -1;
  18. }
  19. std::cout << "put db success" << std::endl;
  20. std::string res;
  21. status = db->Get(leveldb::ReadOptions(), "rc", &res);
  22. if (!status.ok()) {
  23. std::cout << "get db failed" << std::endl;
  24. return -1;
  25. }
  26. std::cout << "get db success" << std::endl;
  27. std::cout << "get " << res << std::endl;
  28. delete db;
  29. return 0;
  30. }

options选项含义

  1. struct options {
  2. // 比较器,用来决定key在表中的排列顺序
  3. // 默认的比较器,按字典序排序
  4. const Comparator* comparator;
  5. // 为true表示,数据库不存在则创建
  6. bool create_if_missing = false;
  7. // 为true表示,数据库存在则报错
  8. bool error_if_exists = false;
  9. // 为true表示,严格检错模式,可能导致数据库不可用
  10. bool paranoid_checks = false;
  11. // 平台兼容性相关,暂不了解
  12. // 默认为Env::Default()
  13. Env* env;
  14. // 为null则日志信息和数据内容写在同一个文件
  15. // 不为null,单独写到info_log文件
  16. Logger* info_log = nullptr;
  17. // 大的写缓存可以提升性能,特别是大块数据加载的时候
  18. // 但是会导致下次打开数据库花更多时间来recovery
  19. size_t write_buffer_size = 4 * 1024 * 1024;
  20. // 数据库最多能打开的文件数
  21. // 一般每2MB的working set会用一个文件
  22. int max_open_files = 1000;
  23. // 块缓存,块就是从磁盘读取的一个单位
  24. // 为null,用8MB的内部缓存
  25. // 不为null,则用指定的缓存
  26. Cache* block_cache = nullptr;
  27. // 块的大小
  28. size_t block_size = 4 * 1024;
  29. // 差分编码时key的数目,可以动态改变,建议不修改。
  30. int block_restart_interval = 16;
  31. // leveldb最大写文件的大小,达到该值将创建新的文件
  32. // 一般不用更改
  33. size_t max_file_size = 2 * 1024 * 1024;
  34. // 压缩算法,可以算kSnappyCompression和KNoCompression
  35. // kSnappyCompression一般压缩速率:
  36. // ~200-500MB/s compression
  37. // ~400-800MB/s decompression
  38. CompressionType compression = kSnappyCompression;
  39. // 为true的话,会采用追加模式写manifest和log,可以提升数据库开启速度
  40. bool reuse_logs = false;
  41. // 如果用NewBloomFilterPolicy可以提升读取速度
  42. const FilterPolicy* filter_policy = nullptr;
  43. };
  44. struct ReadOptions {
  45. // 为true,则读取数据的时候会检测校验和
  46. bool verify_checksums = false;
  47. // 是否将此次读数据的迭代缓存到内存
  48. // 设置为false,可以提升大块数据扫描效率
  49. bool fill_cache = true;
  50. // 不为null,则从指定快照中读取数据
  51. // 为null,则从当前开始读取时的快照中读取数据
  52. const Snapshot* snapshot = nullptr;
  53. };
  54. struct WriteOptions {
  55. // 是否同步写,为true会降低写速率
  56. bool sync = false;
  57. };

status错误代码

  1. class Status {
  2. public:
  3. // 运行成功
  4. bool ok() const;
  5. // 未找到错误
  6. bool IsNotFound() const;
  7. // 崩溃错误
  8. bool IsCorruption() const
  9. // IO错误
  10. bool IsIOError() const;
  11. // 不支持错误
  12. bool IsNotSupportedError() const;
  13. // 参数非法错误
  14. bool IsInvalidArgument() const;
  15. };

Slice

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

  1. class Slice {
  2. public:
  3. Slice(const char* s) : data_(s), size_(strlen(s)) {}
  4. Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
  5. std::string ToString() const { return std::string(data_, size_); }
  6. const char* data() const { return data_; }
  7. private:
  8. const char* data_;
  9. size_t size_;
  10. };

使用leveldb的更多相关文章

  1. leveldb 性能、使用场景评估

    最近有个业务写远远大于读,读也集中在最近写入,这不很适合采用leveldb存储么,leveldb业界貌似ssdb用得挺广,花了两天时间就ssdb简单做下测试,以下总结. ssdb 是leveldb的r ...

  2. leveldb源码分析--SSTable之Compaction

    对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...

  3. leveldb 学习。

    1)大概浏览了leveldb文档的介绍.本想逐步看代码,想想还是自己先实现一个看看如何改进. 2)完成了一个非常丑陋的初版,但是还是比初初版有进步. 3)key value的数据库,不允许有key重复 ...

  4. 解决: org.iq80.leveldb.DBException: IO error: C:\data\trie\000945.sst: Could not create random access file.

    以太坊MPT树的持久化层是采用了leveldb数据库,然而在抽取MPT树代码运行过程中,进行get和write操作时却发生了错误: Caused by: org.fusesource.leveldbj ...

  5. 用Qt Creator 对 leveldb 进行简单的读写

    #include <iostream> #include <string> #include <leveldb/db.h> #include <boost/l ...

  6. leveldb 学习笔记之VarInt

    在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ...

  7. leveldb源码学习系列

    楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ...

  8. LevelDB库简介

    LevelDB库简介 一.LevelDB入门 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询 ...

  9. zookeeper + LevelDB + ActiveMQ实现消息队列高可用

    通过集群实现消息队列高可用. 消息队列在项目中存储订单.邮件通知.数据分发等重要信息,故对消息队列稳定可用性有高要求. 现在通过zookeeper选取activemq leader的形式实现当某个ac ...

  10. leveldb.net对象读写封装

    leveldb是一个非常高效的可嵌入式K-V数据库,在.NET下有着基于win实现的包装leveldb.net;不过leveldb.net只提供了基于byte[]和string的处理,这显然会对使用的 ...

随机推荐

  1. hyperledger explorer 结合 fabric1.4 搭建 区块链浏览器 踩坑记录

    博主通过这篇博客的步骤搭建区块链浏览器:https://blog.csdn.net/qq_32675427/article/details/99946945 进行到下面这一步时出现各种异常,浪费了博主 ...

  2. centos7图形化安装oracle11g

    #设置主机名 hostnamectl set-hostname oracle #yum安装 yum -y install unzip vim* bash-completion bash-complet ...

  3. Linux下vim的安装及配置

    目录 一.vim的下载 二.vim的基本知识 三.vim的基本配置 四.vim与外部文件的复制粘贴 一.vim的下载 Ubuntu系统,输入命令: sudo apt install vim Cento ...

  4. C enum(枚举)

    C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读. 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 ...

  5. 《C++深度解析》课程目录

    <C++深度解析>课程目录 第1课 - 学习 C++ 的意义 第2课 - C到C++的升级     第3课 - 进化后的const分析 第4课 - 布尔类型和引用 第5课 - 引用的本质分 ...

  6. 【译】Visual Studio 2019 的 Local Process with Kubernetes

    今天,我们自豪地宣布 Local Process with Kubernetes 的预览版已加入到 Visual Studio 2019 16.7 Preview 2 中.  Local Proces ...

  7. Linux实战(19):Shell交互式read 用法

    read 用法有好几种,我在实战过程中用到了 -p,记一笔以防不用忘记了. 实例 #!/bin/bash echo "检测IP是否被占用" while read -p " ...

  8. Unity 自己使用顶点描绘圆形UI图片

    2020-09-10 在游戏的UI中,圆形图片的需求是很高的,但是,在Unity中想要实现圆形UI,一般的做法是是使用圆形Mask(遮罩),但是使用Mask的缺点很明显,主要有三点: 1.比较麻烦,使 ...

  9. java学习从“菜鸟”到“放弃”

    今天学到java的对象和类中, 由于刚考完c++面向对象与程序设计这门课,对于c++中的类掌握自认为不错,就开始过渡到java. 今天面对的问题,在书写一个类的时候,发现了许多与c++不同的地方. 比 ...

  10. Jenkins打Docker镜像推送到私有仓库

    Jenkins打Docker镜像推送到私有仓库 因为我的Jenkins是安装在群晖NAS中的docker,所以我这边就以Docker安装Jenkins为例 echo '================ ...