官方文档:https://github.com/google/leveldb/blob/main/doc/index.md
调试环境:Ubuntu24.04
1. 安装 libleveldb-dev
apt install -y libleveldb-dev
2. C++ 操作 leveldb
2.1 打开数据库
std::string dbname = "./lvdb";
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
//options.error_if_exists = true; //如果数据库已存在,则报错
leveldb::Status s = leveldb::DB::Open(options, dbname, &db);
if(!s.ok()) {
std::cout << "opendb failed: " << s.ToString() << std::endl;
} else {
std::cout << "opendb success" << std::endl;
}
2.2 插入数据
s = db->Put(leveldb::WriteOptions(), key, value);
2.3 get 数据
s = db->Get(leveldb::ReadOptions(), key, &value);
2.4 删除数据
s = db->Delete(leveldb::WriteOptions(), key);
2.5 完整例子代码
#include <leveldb/db.h>
#include <iostream>
void put_get_delete(leveldb::DB* db) {
leveldb::Status s;
//插入数据
std::string key = "hello";
std::string value = "world";
s = db->Get(leveldb::ReadOptions(), key, &value);
if(s.IsNotFound()) {
std::cout << "error " << s.ToString() << " for key: " << key << std::endl;
}
s = db->Put(leveldb::WriteOptions(), key, value);
if(!s.ok()) {
std::cout << "Put data failed: " << s.ToString() << std::endl;
} else {
std::cout << "Put data success" << std::endl;
}
value = "";
s = db->Get(leveldb::ReadOptions(), key, &value);
std::cout << "Get data, key: " << key << ", value: " << value << std::endl;
s = db->Delete(leveldb::WriteOptions(), key);
if(!s.ok()) {
std::cout << "Delete key failed: " << s.ToString() << std::endl;
} else {
std::cout << "Delete key success: " << s.ToString() << std::endl;
}
s = db->Get(leveldb::ReadOptions(), key, &value);
if(s.IsNotFound()) {
std::cout << "error " << s.ToString() << " for key: " << key << std::endl;
}
}
void loop(leveldb::DB* db) {
std::string value = "xxx";
leveldb::Status s;
s = db->Put(leveldb::WriteOptions(), "k1", value);
s = db->Put(leveldb::WriteOptions(), "k2", value);
s = db->Put(leveldb::WriteOptions(), "k3", value);
leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
//it->Seek(start); // seek to 指定的 key 前缀
//for (it->SeekToLast(); it->Valid(); it->Prev()) // seek to last key
for (it->SeekToFirst(); it->Valid(); it->Next()) {
std::cout << it->key().ToString() << ": " << it->value().ToString() << std::endl;
}
if(!it->status().ok()) {
std::cout << "some error ahppend: " << it->status().ToString() << std::endl;
}
delete it;
}
int main() {
std::string dbname = "./lvdb";
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
//options.error_if_exists = true; //如果数据库已存在,则报错
leveldb::Status s = leveldb::DB::Open(options, dbname, &db);
if(!s.ok()) {
std::cout << "opendb failed: " << s.ToString() << std::endl;
} else {
std::cout << "opendb success" << std::endl;
}
put_get_delete(db);
loop(db);
delete db;
return 0;
}