视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
LevelDB:一个快速轻量级的key-value存储库(译)
2020-11-09 10:23:38 责编:小采
文档


作者: JeffDean,SanjayGhemawat 原文: 译者: phylips@bmy2011-8-16 译文: 打开一个数据库 一个 LevelDB 数据库有一个文件系统目录名称与之关联。该数据库的所有内容都存储在该目录下。下面的例子展示了如何打开一个数据库,或者如何在必要的时候创建一个

作者:Jeff Dean, Sanjay Ghemawat

原文:

译者:phylips@bmy 2011-8-16

译文:

打开一个数据库

一个LevelDB数据库有一个文件系统目录名称与之关联。该数据库的所有内容都存储在该目录下。下面的例子展示了如何打开一个数据库,或者如何在必要的时候创建一个:

#include

#include "leveldb/db.h"

leveldb::DB* db;

leveldb::Options options;

options.create_if_missing = true;

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

assert(status.ok());

...

如果你想在数据库已经存在的情况下,让上面的代码产生一个错误,需要再Open调用之前加入如下一行:

options.error_if_exists = true;

状态(status)

leveldb::Status s = ...;

if (!s.ok()) cerr << s.ToString() << endl;

关闭数据库

在完成一个数据库的处理之后,直接删除该数据库对象即可。

... open the db as described above ...

... do something with db ...

delete db;

读操作与写操作

std::string value;

leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);

if (s.ok()) s = db->Put(leveldb::WriteOptions(), key2, value);

if (s.ok()) s = db->Delete(leveldb::WriteOptions(), key1);

原子性更新

#include "leveldb/write_batch.h"

...

std::string value;

leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);

if (s.ok()) {

leveldb::WriteBatch batch;

batch.Delete(key1);

batch.Put(key2, value);

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

}

WriteBatch 同步性的写操作

leveldb::WriteOptions write_options;

write_options.sync = true;

db->Put(write_options, ...);

并发 迭代

下面的例子用来说明如何打印出数据库中的所有key value对。

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

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

cout << it->key().ToString() << ": " << it->value().ToString() << endl;

}

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

// Check for any errors found during the scan

delete it;

for (it->Seek(start);

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

it->Next()) {

...

}

for (it->SeekToLast(); it->Valid(); it->Prev()) {

...

}

Snapshots

leveldb::ReadOptions options;

options.snapshot = db->GetSnapshot();

... apply some updates to db ...

leveldb::Iterator* iter = db->NewIterator(options);

... read using iter to view the state when the snapshot was created ...

delete iter;

db->ReleaseSnapshot(options.snapshot);

leveldb::Snapshot* snapshot;

leveldb::WriteOptions write_options;

write_options.post_write_snapshot = &snapshot;

leveldb::Status status = db->Write(write_options, ...);

... perform other mutations to db ...

leveldb::ReadOptions read_options;

read_options.snapshot = snapshot;

leveldb::Iterator* iter = db->NewIterator(read_options);

... read as of the state just after the Write call returned ...

delete iter;

db->ReleaseSnapshot(snapshot);

Slice

leveldb::Slice s1 = "hello";

std::string str("world");

leveldb::Slice s2 = str;

std::string str = s1.ToString();

assert(str == std::string("hello"));

。比如下面代码的就是有问题的:

leveldb::Slice slice;

if (...) {

std::string str = ...;

slice = str;

}

Use(slice);

比较器

class TwoPartComparator : public leveldb::Comparator {

public:

// Three-way comparison function:

// if a < b: negative result

// if a > b: positive result

// else: zero result

int Compare(const leveldb::Slice& a, const leveldb::Slice& b) const {

int a1, a2, b1, b2;

ParseKey(a, &a1, &a2);

ParseKey(b, &b1, &b2);

if (a1 < b1) return -1;

if (a1 > b1) return +1;

if (a2 < b2) return -1;

if (a2 > b2) return +1;

return 0;

}

// Ignore the following methods for now:

const char* Name() const { return "TwoPartComparator"; }

void FindShortestSeparator(std::string*, const leveldb::Slice&) const { }

void FindShortSuccessor(std::string*) const { }

};

现在使用定制的比较器,创建一个数据库:

TwoPartComparator cmp;

leveldb::DB* db;

leveldb::Options options;

options.create_if_missing = true;

options.comparator = &cmp;

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

向后兼容(Backwards compatibility)

性能

可以通过改变include/leveldb/options.h里的默认值来对性能进行调整优化。

块大小 压缩

下载本文
显示全文
专题