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

比特币客户端使用的数据库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数据库,实现增删改查

  1. LevelDB库简介
阅读更多

更多精彩内容