leveldb java_LevelDB:使用介绍
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:使用介绍相关推荐
- leveldb java_LevelDB 代码撸起来!
LevelDB 的大致原理已经讲完了,本节我们要亲自使用 Java 语言第三方库 leveldbjni 来实践一下 LevelDB 的各种特性.这个库使用了 Java Native Interface ...
- 区块链之LevelDB
一.leveldb简介 Leveldb是一个Google实现的非常高效的kv开源数据库,版本1.2能够支持billion级别的数据量了. 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计, ...
- 360高性能KV存储平台Zeppelin
360高性能KV存储平台Zeppelin Zeppelin 是奇虎 360 开源的一个高性能,高可用的分布式 Key-Value 存储平台,它以高性能.大集群为目标,并希望能在 Zeppelin 的基 ...
- 专注java分布式架构之Zeppelin不是飞艇
过去的一年多的时间中,大部分的工作都围绕着Zeppelin这个项目展开,经历了Zeppelin的从无到有,再到逐步完善稳定.见证了Zeppelin的成长的同时,Zeppelin也见证了我的积累进步.对 ...
- 蚂蚁金服资深架构师解析Zeppelin不是飞艇
Zeppelin是一个高性能,高可用的分布式Key-Value存储平台,以高性能.大集群为目标,说平台是因为Zeppelin不是终点而是起点,在Zeppelin的基础上,不仅能够提供KV的访问,还可以 ...
- LevelDb简单介绍和原理——本质:类似nedb,插入数据文件不断增长(快照),再通过删除老数据做更新...
转自:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 有时间再好好看下整个文章! 说起LevelDb也许您不清楚,但是如果作 ...
- LevelDB整体介绍
参考:http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html 1. leveldb简单介绍 说起LevelDb也许您不清楚,但是如果 ...
- LevelDB 介绍
早上过来,微博上无意中看到有人转LevelDB相关实现的文章,突然脑海里对这个k/v数据库记得曾经有个印象,因为记得淘宝tair是基于此实现的,(有时间记录下阅读tair对其架构的简单记录笔记),为此 ...
- Apache Samza流处理框架介绍——kafka+LevelDB的Key/Value数据库来存储历史消息+?
转自:http://www.infoq.com/cn/news/2015/02/apache-samza-top-project Apache Samza是一个开源.分布式的流处理框架,它使用开源分布 ...
最新文章
- 7000p可以加装固态吗_玩车十年的大神都加装防倾杆,但真的可以提高车身刚性吗?...
- 子域名枚举工具Sublist3r
- 048_Calendar日历
- android webview loadurl本地,Android WebView 使用loadUrl方法执行本地JavaScript
- linux 修改默认路径吗,linux中vsftp修改默认路径
- 爬虫 spider06——解析数据
- 关于datediff(year,开始日期,结束日期)中year格式的说明,特别注意year两边不能加引号,否则报错...
- fast start oracle,Oracle Data Guard快速启动故障切换 - fast-start failover(FSFO)
- 三人表决器_数电小实验之三人表决器
- NoClassDefFoundError: Could not initialize class com.fasterxml.jackson.databind.ObjectMapper
- 有赞 插入html,有赞 前端工程师面试题
- php 省份的缩写,34个省级行政区记忆口诀、省份简称和省会城市表
- 英语语法---名词性从句详解
- win2008服务器系统玩红警,win10系统玩红警卡死的两种方法
- 产品研发记录05:产品研发人员应当具备的特质
- Pygame 简单打字游戏
- PAT考试一些注意事项
- 【C++算法题】求三角形边长
- vue源码深入解读MVVM(视图模板引擎),你真的了解双向绑定(v-model),数据劫持(observe),发布订阅模式吗?带你手鲁mvvm引擎。源码奉上(详细注释)!
- WIN7下C:\Documents and Settings 无法打开_雨山_百度空间