LevelDB 提供的接口其實(shí)很簡(jiǎn)單,下面舉例進(jìn)行簡(jiǎn)單說(shuō)明。
例子
#include <iostream>
#include <cassert>
#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;
}
這個(gè)例子簡(jiǎn)單介紹了 LevelDB 的基本用法,包括:
- 打開(kāi)數(shù)據(jù)庫(kù)。
- 寫(xiě)入一條數(shù)據(jù)。
- 讀取一條數(shù)據(jù)。
- 批量原子操作。
- 范圍查找。
- 關(guān)閉數(shù)據(jù)庫(kù)。
打開(kāi)數(shù)據(jù)庫(kù)
...
// 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());
...
打開(kāi) LevelDB 數(shù)據(jù)庫(kù)需要三個(gè)參數(shù):
-
leveldb::Options :控制 DB 行為的一些參數(shù),具體可以參考鏈接指向的代碼。在這里
create_if_missing為true表示如果數(shù)據(jù)庫(kù)./testdb存在就直接打開(kāi),不存在就創(chuàng)建。 -
./testdb:LevelDB 數(shù)據(jù)庫(kù)的根目錄。一個(gè) LevelDB 數(shù)據(jù)庫(kù)存放在一個(gè)目錄下。 -
&db:用來(lái)返回一個(gè) LevelDB 實(shí)例。
- leveldb::Status :封裝了 leveldb 接口返回的詳細(xì)信息。
寫(xiě)入一條數(shù)據(jù)
...
// Write data.
status = db->Put(leveldb::WriteOptions(), "name", "jinhelin");
assert(status.ok());
...
Put 接口的三個(gè)參數(shù):
-
leveldb::WriteOptions :目前里面只有一個(gè)
sync成員。表示寫(xiě)完 WAL 后是否需要 flush。 - 另外兩個(gè)參數(shù)分別是本次寫(xiě)入數(shù)據(jù)的 Key 和 Value。
讀取一條數(shù)據(jù)
...
// Read data.
std::string val;
status = db->Get(leveldb::ReadOptions(), "name", &val);
assert(status.ok());
std::cout << val << std::endl;
...
Get 接口和 Put 接口比較像,除了 leveldb::ReadOptions 參數(shù)是用來(lái)控制讀操作的,具體見(jiàn)鏈接指向的代碼。
批量原子修改
...
// 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 接口支持原子地修改多條數(shù)據(jù),主要參數(shù)是 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 通過(guò)提供 leveldb::Iterator 來(lái)實(shí)現(xiàn)范圍查找。
關(guān)閉數(shù)據(jù)庫(kù)
...
// Close a database.
delete db;
...
最后,關(guān)閉數(shù)據(jù)庫(kù)時(shí)需要?jiǎng)h除掉創(chuàng)建的數(shù)據(jù)庫(kù)實(shí)例,讓其調(diào)用析構(gòu)函數(shù)處理一些收尾工作。
Snapshot
LevelDB 還提供了快照(Snapshot)的功能,讓?xiě)?yīng)用可以獲得數(shù)據(jù)庫(kù)在某一時(shí)刻的只讀的一致性數(shù)據(jù)??梢岳?LevelDB 的 Snapshot 功能實(shí)現(xiàn)類似 MySQL 的 MVCC。