您的位置:首页 > 数据库

比特币客户端使用的数据库levelDB介绍

2017-06-28 13:58 1451 查看

比特币客户端使用的数据库levelDB介绍

简介

比特币核心客户端使用 Google 的 LevelDB 数据库存储区块链元数据。Leveldb是一个google实现的非常高效的kv数据库,并且是开源的。

它的一个主要特点就是写的性能非常好,适用于比特币客户端这种应用场景。

下图是LevelDB运行一段时间后的存储模型快照,



内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,log文件以及SSTable文件。

log文件几乎是所有的数据库软件必备的机制了,主要是用于数据异常恢复和数据同步的。

SSTable文件是磁盘上的核心存储结构,它是分层存储的。这也是levelDB名字的由来。

使用示例

levelDB虽然是个数据库,但是并不像其它的主流数据库(mysql ,oracle等)可以提供客户端连接服务。它只是一个基于c++的lib库而已,所以我们使用起来也很简单,直接在工程里链接lib库文件,然后代码中包含头文件就可以使用了。

下面是我在windows 10环境下,用vs2010编写levelDB使用示例的步骤。

第一步当然是要获取levelDB的库文件和头文件。由于levelDB是开源的,所以我们可以下载源码吧,然后在windows环境下编译生成库文件。

levelDB开源地址

我这里对编译levelDB不做过多的讲解,网上有很多教程。(注意编译过程需要boost)大家可以从下面这个地址直接下载我编译好的库文件。

levelDB windows库文件下载

下载完后配置到vs2010的工程中(配置过程省略),代码如下:

#include <assert.h>
#include <string.h>
#include <iostream>

#include "leveldb/db.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
leveldb::DB      *db;
leveldb::Options  options;
options.create_if_missing = true;

// 打开数据库
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());

string key = "name";
string value = "pony";

// 写
status = db->Put(leveldb::WriteOptions(), key, value);
assert(status.ok());

// 读
status = db->Get(leveldb::ReadOptions(), key, &value);
assert(status.ok());

cout << value << endl;

// 删
status = db->Delete(leveldb::WriteOptions(), key);
assert(status.ok());

status = db->Get(leveldb::ReadOptions(), key, &value);
if (!status.ok()) {
cerr << key << "    " << status.ToString() << endl;
}
else {
cout << key << "===" << value << endl;
}

// 关闭数据库
delete db;

return 0;
}


运行成功后,到工程目录下的/tmp/testdb下面可以看到生产的数据库文件。

参考

1.怎样操作leveldb数据库,实现增删改查

LevelDB库简介
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: