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

安装

cd leveldb

mkdir -p build && cd build

cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .

make install

Code Demo

#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;

}

Code Usage

cd leveldb && mkdir test

cp build/libleveldb.a test/ && cd test

vim test.cpp (:set paste Shift + Insert :wq)

g++ -o leveldbTest test.cpp libleveldb.a -lpthread

g++ -o leveldbTest test.cpp libleveldb.a -lpthread -lsnappy (options)

./leveldbTest

jinhelin

name0: jinhelin0

name1: jinhelin1

name2: jinhelin2

name3: jinhelin3

name4: jinhelin4

name5: jinhelin5

name6: jinhelin6

name7: jinhelin7

name8: jinhelin8

name9: jinhelin9

name3: jinhelin3

name4: jinhelin4

name5: jinhelin5

name6: jinhelin6

name7: jinhelin7

这个例子简单介绍了 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。

参考文档

leveldb java_LevelDB:使用介绍相关推荐

  1. leveldb java_LevelDB 代码撸起来!

    LevelDB 的大致原理已经讲完了,本节我们要亲自使用 Java 语言第三方库 leveldbjni 来实践一下 LevelDB 的各种特性.这个库使用了 Java Native Interface ...

  2. 区块链之LevelDB

    一.leveldb简介 Leveldb是一个Google实现的非常高效的kv开源数据库,版本1.2能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计, ...

  3. 360高性能KV存储平台Zeppelin

    360高性能KV存储平台Zeppelin Zeppelin 是奇虎 360 开源的一个高性能,高可用的分布式 Key-Value 存储平台,它以高性能.大集群为目标,并希望能在 Zeppelin 的基 ...

  4. 专注java分布式架构之Zeppelin不是飞艇

    过去的一年多的时间中,大部分的工作都围绕着Zeppelin这个项目展开,经历了Zeppelin的从无到有,再到逐步完善稳定.见证了Zeppelin的成长的同时,Zeppelin也见证了我的积累进步.对 ...

  5. 蚂蚁金服资深架构师解析Zeppelin不是飞艇

    Zeppelin是一个高性能,高可用的分布式Key-Value存储平台,以高性能.大集群为目标,说平台是因为Zeppelin不是终点而是起点,在Zeppelin的基础上,不仅能够提供KV的访问,还可以 ...

  6. LevelDb简单介绍和原理——本质:类似nedb,插入数据文件不断增长(快照),再通过删除老数据做更新...

    转自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 有时间再好好看下整个文章! 说起LevelDb也许您不清楚,但是如果作 ...

  7. LevelDB整体介绍

    参考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 1. leveldb简单介绍 说起LevelDb也许您不清楚,但是如果 ...

  8. LevelDB 介绍

    早上过来,微博上无意中看到有人转LevelDB相关实现的文章,突然脑海里对这个k/v数据库记得曾经有个印象,因为记得淘宝tair是基于此实现的,(有时间记录下阅读tair对其架构的简单记录笔记),为此 ...

  9. Apache Samza流处理框架介绍——kafka+LevelDB的Key/Value数据库来存储历史消息+?

    转自:http://www.infoq.com/cn/news/2015/02/apache-samza-top-project Apache Samza是一个开源.分布式的流处理框架,它使用开源分布 ...

最新文章

  1. 7000p可以加装固态吗_玩车十年的大神都加装防倾杆,但真的可以提高车身刚性吗?...
  2. 子域名枚举工具Sublist3r
  3. 048_Calendar日历
  4. android webview loadurl本地,Android WebView 使用loadUrl方法执行本地JavaScript
  5. linux 修改默认路径吗,linux中vsftp修改默认路径
  6. 爬虫 spider06——解析数据
  7. 关于datediff(year,开始日期,结束日期)中year格式的说明,特别注意year两边不能加引号,否则报错...
  8. fast start oracle,Oracle Data Guard快速启动故障切换 - fast-start failover(FSFO)
  9. 三人表决器_数电小实验之三人表决器
  10. NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.ObjectMapper
  11. 有赞 插入html,有赞 前端工程师面试题
  12. php 省份的缩写,34个省级行政区记忆口诀、省份简称和省会城市表
  13. 英语语法---名词性从句详解
  14. win2008服务器系统玩红警,win10系统玩红警卡死的两种方法
  15. 产品研发记录05:产品研发人员应当具备的特质
  16. Pygame 简单打字游戏
  17. PAT考试一些注意事项
  18. 【C++算法题】求三角形边长
  19. vue源码深入解读MVVM(视图模板引擎),你真的了解双向绑定(v-model),数据劫持(observe),发布订阅模式吗?带你手鲁mvvm引擎。源码奉上(详细注释)!
  20. WIN7下C:\Documents and Settings 无法打开_雨山_百度空间

热门文章

  1. 架设ftp,架设ftp的2种方法
  2. 二维otsu算法python_【OpenCV+Python】图像阈值与OTSU算法
  3. iframe设置背景透明(allowTransparency属性)
  4. 亚马逊电动玩具CPC认证测试标准要求
  5. 2022年了,二十年编程语言风云,哪款是你的爱豆?
  6. RemoteViews详细解释
  7. OpenCv 练习题 霍夫(Hough)变换
  8. 网络安全自学笔记08 - Linux之shell
  9. 部分源代码加密_UG后处理加密解密器正式版提供下载使用
  10. 关于管理经济学的有趣解释