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. SSH框架下页面跳转入门篇

    一.完成目标,因为WEB-INF下面的界面不能通过输入地址的方式直接访问,所以需要在后台定义一个方法跳转过去. 步骤1:.创建普通类继承ActionSupport类,并定义一个方法返回需要跳转的路径 ...

  2. Redis 6.0.8 紧急发布,请尽快升级!

    大家周末愉快啊,今天分享一则重要通知. Redis 6.0.8 于 2020/9/10 日晚紧急发布!!! 可以看到这是一个紧急更新版本,使用了 Redis 6.0.7 Sentinel(哨兵)以及 ...

  3. Intersection of Two Prisms(AOJ 1313)

    原题如下: Suppose that P1 is an infinite-height prism whose axis is parallel to the z-axis, and P2 is al ...

  4. liunx之firewalld&SELinux

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  5. hystrix总结之限流

    hystrix使用舱壁隔离模式来隔离和限制各个请求,设计了两种隔离方式:信号量和线程池.线程池隔离:对每个command创建一个自己的线程池,执行调用.通过线程池隔离来保证不同调用不会相互干扰和每一个 ...

  6. 面试题:JVM在Java堆中对对象的创建、内存结构、访问方式

    一.对象创建过程 1.检查类是否已被加载 JVM遇到new指令时,首先会去检查这个指令参数能否在常量池中定位到这个类的符号引用,检查这个符号引用代表的类是否已被加载.解析.初始化,若没有,则进行类加载 ...

  7. leetcode560题解【前缀和+哈希】

    leetcode560.和为K的子数组 题目链接 算法 前缀和+哈希 时间复杂度O(n). 在解决这道题前需要先清楚,一个和为k的子数组即为一对前缀和的差值. 1.我们假设有这么一个子数组[i,j]满 ...

  8. 2.Strom-入门案例

  9. 浅谈c++(一)

    本人为菜鸟一枚,如有错误,欢迎指正. 由于上半年学了C语言,为了更好的过渡到C++,我将在未来展示一下两者的不同以及优缺点.在c++中,不得不谈到类.这是C++中最重要的语法特征.我们可以通过它,定义 ...

  10. python条件控制语句要注意什么?本文详解

    1.条件判断语句(if语句) 执⾏的流程:if语句在执⾏时,会先对条件表达式进⾏求值判断, 如果为True,则执⾏if后的语句 如果为False,则不执⾏ 语法: if 条件表达式 : 代码块 代码块 ...