leveldb mysql_LevelDB:使用介绍

LevelDB 提供的接口其实很简单,下面举例进行简单说明。

例子

#include

#include

#include "leveldb/db.h"

#include "leveldb/write_batch.h"

int main()

{

// Open a database.

leveldb::DB* db;

leveldb::Options opts;

opts.create_if_missing = true;

leveldb::Status status = leveldb::DB::Open(opts, "./testdb", &db);

assert(status.ok());

// Write data.

status = db->Put(leveldb::WriteOptions(), "name", "jinhelin");

assert(status.ok());

// Read data.

std::string val;

status = db->Get(leveldb::ReadOptions(), "name", &val);

assert(status.ok());

std::cout << val << std::endl;

// Batch atomic write.

leveldb::WriteBatch batch;

batch.Delete("name");

batch.Put("name0", "jinhelin0");

batch.Put("name1", "jinhelin1");

batch.Put("name2", "jinhelin2");

batch.Put("name3", "jinhelin3");

batch.Put("name4", "jinhelin4");

batch.Put("name5", "jinhelin5");

batch.Put("name6", "jinhelin6");

batch.Put("name7", "jinhelin7");

batch.Put("name8", "jinhelin8");

batch.Put("name9", "jinhelin9");

status = db->Write(leveldb::WriteOptions(), &batch);

assert(status.ok());

// Scan database.

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());

for (it->SeekToFirst(); it->Valid(); it->Next()) {

std::cout << it->key().ToString() << ": " <<

it->value().ToString() << std::endl;

}

assert(it->status().ok());

// Range scan, example: [name3, name8)

for (it->Seek("name3");

it->Valid() && it->key().ToString() < "name8";

it->Next()) {

std::cout << it->key().ToString() << ": " <<

it->value().ToString() << std::endl;

}

// Close a database.

delete db;

}

这个例子简单介绍了 LevelDB 的基本用法,包括:

打开数据库。

写入一条数据。

读取一条数据。

批量原子操作。

范围查找。

关闭数据库。

打开数据库

...

// Open a database.

leveldb::DB* db;

leveldb::Options opts;

opts.create_if_missing = true;

leveldb::Status status = leveldb::DB::Open(opts, "./testdb", &db);

assert(status.ok());

...

打开 LevelDB 数据库需要三个参数:

leveldb::Options :控制 DB 行为的一些参数,具体可以参考链接指向的代码。在这里 create_if_missing 为 true 表示如果数据库./testdb 存在就直接打开,不存在就创建。

./testdb :LevelDB 数据库的根目录。一个 LevelDB 数据库存放在一个目录下。

&db :用来返回一个 LevelDB 实例。

leveldb::Status :封装了 leveldb 接口返回的详细信息。

写入一条数据

...

// Write data.

status = db->Put(leveldb::WriteOptions(), "name", "jinhelin");

assert(status.ok());

...

Put 接口的三个参数:

leveldb::WriteOptions :目前里面只有一个 sync 成员。表示写完 WAL 后是否需要 flush。

另外两个参数分别是本次写入数据的 Key 和 Value。

读取一条数据

...

// Read data.

std::string val;

status = db->Get(leveldb::ReadOptions(), "name", &val);

assert(status.ok());

std::cout << val << std::endl;

...

Get 接口和 Put 接口比较像,除了 leveldb::ReadOptions 参数是用来控制读操作的,具体见链接指向的代码。

批量原子修改

...

// Batch atomic write.

leveldb::WriteBatch batch;

batch.Delete("name");

batch.Put("name0", "jinhelin0");

batch.Put("name1", "jinhelin1");

batch.Put("name2", "jinhelin2");

batch.Put("name3", "jinhelin3");

batch.Put("name4", "jinhelin4");

batch.Put("name5", "jinhelin5");

batch.Put("name6", "jinhelin6");

batch.Put("name7", "jinhelin7");

batch.Put("name8", "jinhelin8");

batch.Put("name9", "jinhelin9");

status = db->Write(leveldb::WriteOptions(), &batch);

assert(status.ok());

...

LevelDB 的 Write 接口支持原子地修改多条数据,主要参数是 leveldb::WriteBatch 。

范围查找

...

// Scan database.

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());

for (it->SeekToFirst(); it->Valid(); it->Next()) {

std::cout << it->key().ToString() << ": " <<

it->value().ToString() << std::endl;

}

assert(it->status().ok());

// Range scan, example: [name3, name8)

for (it->Seek("name3");

it->Valid() && it->key().ToString() < "name8";

it->Next()) {

std::cout << it->key().ToString() << ": " <<

it->value().ToString() << std::endl;

}

...

LevelDB 通过提供 leveldb::Iterator 来实现范围查找。

关闭数据库

...

// Close a database.

delete db;

...

最后,关闭数据库时需要删除掉创建的数据库实例,让其调用析构函数处理一些收尾工作。

Snapshot

LevelDB 还提供了快照(Snapshot)的功能,让应用可以获得数据库在某一时刻的只读的一致性数据。可以利用 LevelDB 的 Snapshot 功能实现类似 MySQL 的 MVCC。

参考文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值