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 {
// 比较器,用来决定key在表中的排列顺序
// 默认的比较器,按字典序排序
const Comparator* comparator; // 为true表示,数据库不存在则创建
bool create_if_missing = false; // 为true表示,数据库存在则报错
bool error_if_exists = false; // 为true表示,严格检错模式,可能导致数据库不可用
bool paranoid_checks = false; // 平台兼容性相关,暂不了解
// 默认为Env::Default()
Env* env; // 为null则日志信息和数据内容写在同一个文件
// 不为null,单独写到info_log文件
Logger* info_log = nullptr; // 大的写缓存可以提升性能,特别是大块数据加载的时候
// 但是会导致下次打开数据库花更多时间来recovery
size_t write_buffer_size = 4 * 1024 * 1024; // 数据库最多能打开的文件数
// 一般每2MB的working set会用一个文件
int max_open_files = 1000; // 块缓存,块就是从磁盘读取的一个单位
// 为null,用8MB的内部缓存
// 不为null,则用指定的缓存
Cache* block_cache = nullptr; // 块的大小
size_t block_size = 4 * 1024; // 差分编码时key的数目,可以动态改变,建议不修改。
int block_restart_interval = 16; // leveldb最大写文件的大小,达到该值将创建新的文件
// 一般不用更改
size_t max_file_size = 2 * 1024 * 1024; // 压缩算法,可以算kSnappyCompression和KNoCompression
// kSnappyCompression一般压缩速率:
// ~200-500MB/s compression
// ~400-800MB/s decompression
CompressionType compression = kSnappyCompression; // 为true的话,会采用追加模式写manifest和log,可以提升数据库开启速度
bool reuse_logs = false; // 如果用NewBloomFilterPolicy可以提升读取速度
const FilterPolicy* filter_policy = nullptr;
}; struct ReadOptions {
// 为true,则读取数据的时候会检测校验和
bool verify_checksums = false; // 是否将此次读数据的迭代缓存到内存
// 设置为false,可以提升大块数据扫描效率
bool fill_cache = true; // 不为null,则从指定快照中读取数据
// 为null,则从当前开始读取时的快照中读取数据
const Snapshot* snapshot = nullptr;
}; struct WriteOptions {
// 是否同步写,为true会降低写速率
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_;
};

使用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. SpringBoot简单(登录/显示/登出)工程下载 使用Thymeleaf输出页面文字

    下载地址:https://files.cnblogs.com/files/xiandedanteng/SessionShare20191226.zip 测试用,画面如下: SpringMVC入门弟子也 ...

  2. wireshark在ubuntu系统中的正确安装方法

    以前一直在使用wireshark这个网络工具,最近在用来抓包学习MQTT协议的时候,发现wireshark暂时还未加入对MQTT协议分析的原生支持,网上搜了一下,可以自己用插件的形式扩展wiresha ...

  3. 文件操作和OS模块的简单操作

    文件的作用 大家应该听说过一句话:“好记性不如烂笔头”. 不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电 ...

  4. 查看windows和linux下端口是否被占用

    1.windows cmd输入netstat -ano |findstr "端口号" 查看到1202端口被使用的进程PID是10692 输入tasklist |findstr 10 ...

  5. oracle之二管理undo

    管理undo(PPT-I-299-309) 7.1 undo的作用(SMON) 使用undo tablespace 存放从datafiles 读出的数据块的前镜像,提供以下四种情况所需要的信息     ...

  6. iOS面试关于http知识点basic-01-http

    URL URL 的全称是 Uniform Resource Locator(统一资源定位符) 通过 1 个 URL,能找到互联网上唯一的 1 个资源 URL就是资源的地址.位置,互联网上的每个资源都有 ...

  7. 移动web开发之rem适配布局

    移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...

  8. C语言01

    从问题到C语言程序设计 1.1计算机的问题求解方法 程序设计面向的问题 什么问题可以用程序的方法解决? 打印九九乘法表 图形变换 文件压缩问题 ....... 一切可计算的问题 如何解决? 确定问题可 ...

  9. 分布式系统监视zabbix讲解五之web监控

    Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...

  10. [Node]创建静态资源服务器

    项目初始化 .gitignore cnpm i eslint -D eslint --init得到.eslintrc.js .eslintrc.js module.exports = { 'env': ...