leveldb学习笔记

官方文档

https://github.com/google/leveldb

常用命令

leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true; //当不存在是创建
leveldb::Status status = leveldb::DB::Open(options, “/tmp/testdb”, &db);
assert(status.ok());

options.error_if_exists = true; //设置当已经打开时报错
if (!s.ok()) cerr << s.ToString() << endl; //查看报错信息

delete db; //删除数据库

Status s = db->GET(leveldb::ReadOptions(), key1, &value); //查询
s = db->Put(leveldb::WriteOptions(), key2, value); //插入
s = db->Delete(leveldb::WriteOptions(), key1); //删除

leveldb::WriteBatch batch;
batch.Delete(key1);
batch.Put(key2, value);
s = db->Write(leveldb::WriteOptions(), &batch); //可以放在delete和put之前,防止相同value保存多个keys,当delete和put相同值是不会进行delete,WriteBatch 可以将多个更新同时执行,提高效率

leveldb::WriteOptions write_options;
write_options.sync = true; //开启写异步,默认写操作是同步的,只有当数据写入到磁盘才返回,效率低。异步比同步效率要高得多,但可能会造成宕机时丢失数据。

一个数据库只能被一个进程打开,多线程时需要加锁保证并发安全

迭代器遍历

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
cout << it->key().ToString() << ": " << it->value().ToString() << endl;
}

范围遍历
for (it->Seek(start);
it->Valid() && it->key().ToString() < limit;
it->Next()) {

}

逆序遍历
for (it->SeekToLast(); it->Valid(); it->Prev()) {

}

创建记录
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 … //iter保存的时数据更新之前的数据
delete iter;
db->ReleaseSnapshot(options.snapshot); //删除试图

Slice类型
Slice是一个包含数据长度和指向外部字符串的指针,it->key()和it->value返回的都是Slice,它可以和string进行转换
Slice s1 = “hello”
string str = s1.ToString();
s1 = str;
使用时要注意保证Slice的指向有效。

排序
leveldb数据默认顺序是字典序,可以通过继承和重载来实现自定义排序

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

}

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

检验
ReadOptions::verify_checksums可以设置为true,来强制对从文件系统读取的所有数据进行校验和验证
Options::paranoid_checks可以在打开数据库之前设置为true,来确保一旦检测到内部错误就尽快抛出异常。当数据库打开的时候可能抛出异常,或者后续的数据库操时抛出。默认情况下,会禁用多疑的检测,这样的话,即使部分持久性存储崩溃数据库依旧可以使用。

你可能感兴趣的:(学习总结)