比特币核心客户端使用 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不做过多的讲解,网上有很多教程。(注意编译过程需要boost)大家可以从下面这个地址直接下载我编译好的库文件。
下载完后配置到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下面可以看到生产的数据库文件。
参考