使用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 {
// 比较器,用来决定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的更多相关文章
- leveldb 性能、使用场景评估
最近有个业务写远远大于读,读也集中在最近写入,这不很适合采用leveldb存储么,leveldb业界貌似ssdb用得挺广,花了两天时间就ssdb简单做下测试,以下总结. ssdb 是leveldb的r ...
- leveldb源码分析--SSTable之Compaction
对于compaction是leveldb中体量最大的一部分,也应该是最为复杂的部分,为了便于理解我们首先从一些基本的概念开始.下面是一些从doc/impl.html中翻译和整理的内容: Level 0 ...
- leveldb 学习。
1)大概浏览了leveldb文档的介绍.本想逐步看代码,想想还是自己先实现一个看看如何改进. 2)完成了一个非常丑陋的初版,但是还是比初初版有进步. 3)key value的数据库,不允许有key重复 ...
- 解决: 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 ...
- 用Qt Creator 对 leveldb 进行简单的读写
#include <iostream> #include <string> #include <leveldb/db.h> #include <boost/l ...
- leveldb 学习笔记之VarInt
在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ...
- leveldb源码学习系列
楼主从2014年7月份开始学习<>,由于书籍比较抽象,为了加深思考,同时开始了Google leveldb的源码学习,主要是想学习leveldb的设计思想和Google的C++编程规范.目 ...
- LevelDB库简介
LevelDB库简介 一.LevelDB入门 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询 ...
- zookeeper + LevelDB + ActiveMQ实现消息队列高可用
通过集群实现消息队列高可用. 消息队列在项目中存储订单.邮件通知.数据分发等重要信息,故对消息队列稳定可用性有高要求. 现在通过zookeeper选取activemq leader的形式实现当某个ac ...
- leveldb.net对象读写封装
leveldb是一个非常高效的可嵌入式K-V数据库,在.NET下有着基于win实现的包装leveldb.net;不过leveldb.net只提供了基于byte[]和string的处理,这显然会对使用的 ...
随机推荐
- Count(*) 与 count(field) 一样吗?
有这么个表: 执行 select count(*) from hy_test select count(deptno) from hy_test 都得到 5 但执行 select count(name ...
- 发布jar包到服务器读取resource目录下文件
* 解决:当项目打包成jar之后resources路径下面的证书文件访问不到* 思路:* 1.运行时先复制一个jar* 2.将复制的jar解压到jar文件目录* 3.删除复制的jar跟解压的非证书文件 ...
- hyperledger fabric 智能合约开发
开发步奏: 1.创建教育联盟 2.区块链服务平台自动生成通道id 3.区块链网络服务人员通过命令行在区块链网络中创建对应通道 4.创建相关教育组织 5.邀请相关组织加入联盟 6.区块链网络管理人员通过 ...
- TomcatAJP文件包含漏洞
漏洞概述 2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布关于Apache Tomcat的安全公告,Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2 ...
- 感知生命周期的数据 -- LiveData
感知生命周期的数据 -- LiveData 零. 前言 上篇文章<万物基于Lifecycle> 介绍了整个Lifecycle体系的基石,今天这篇文章咱们来看看Jetpack给我们带来的活着 ...
- Conscription(POJ 3723)
原题如下: Conscription Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16584 Accepted: 57 ...
- python中多进程multiprocessing、多线程threading、线程池threadpool
浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一.多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=t ...
- awk使用说明(复制别人的)
来源:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,se ...
- Js获取某个节点的类名
1. document.querySelectorAll(".style-color")[0].getAttribute("class") 2. $('.s ...
- JVM运行时数据区--本地方法栈
本地方法栈 1.Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用 2.本地方法栈,也是线程私有的. 3.允许被实现成固定或者是可动态拓展的内存 ...