使用leveldb
C++引入leveldb
编译安装:
git clone --recurse-submodules https://github.com/google/leveldb.git
cd leveldb
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
sudo make install
C++工程引入leveldb库,需链接-lleveldb -lpthread
leveldb使用示例
#include <iostream>
#include <leveldb/db.h>
int main(int argc, char const *argv[])
{
leveldb::DB* db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "testdb", &db);
if (!status.ok()) {
std::cout << "open db failed" << std::endl;
return -1;
}
std::cout << "open db success" << std::endl;
status = db->Put(leveldb::WriteOptions(), "rc", "Hello rc!");
if (!status.ok()) {
std::cout << "put db failed" << std::endl;
return -1;
}
std::cout << "put db success" << std::endl;
std::string res;
status = db->Get(leveldb::ReadOptions(), "rc", &res);
if (!status.ok()) {
std::cout << "get db failed" << std::endl;
return -1;
}
std::cout << "get db success" << std::endl;
std::cout << "get " << res << std::endl;
delete db;
return 0;
}
options选项含义
struct Options {
const Comparator* comparator; // 用来决定key在表中的排列顺序,默认按字典序存放
bool create_if_missing = false; // 为true表示数据库不存在则创建,否则会报错
bool error_if_exists = false; // 为true表示数据库存在则报错
bool paranoid_checks = false; // 为true表示,严格检错模式,出错后可能会导致数据库不可用
Env* env; // 平台兼容性相关,默认为Env::Default()
Logger* info_log = nullptr; // 为null则日志信息和数据内容写在同一个文件,否则单独写到info_log文件
size_t write_buffer_size = 4 * 1024 * 1024; // 大的写缓存可以提升性能,特别是大块数据加载的时候,但会增加内存占用,降低数据库打开速度
int max_open_files = 1000; // 数据库最多能打开的文件数
Cache* block_cache = nullptr; // 缓存块总的大小,为null则使用内部的8MB缓存块
size_t block_size = 4 * 1024; // 缓存块的大小,大缓存块可以提升大块扫描的性能,也能提升压缩性能
size_t max_file_size = 2 * 1024 * 1024; // leveldb最大写文件的大小,达到该值将创建新的文件
CompressionType compression = kSnappyCompression;// 压缩算法,kSnappyCompression或KNoCompression
bool reuse_logs = false; // 为true的话,会采用追加模式写manifest和log,可以提升数据库开启速度
const FilterPolicy* filter_policy = nullptr; // 如果用NewBloomFilterPolicy可以减少磁盘读取次数,但是会增加内存占用
}
struct ReadOptions {
bool verify_checksums = false; // 是否对查询出的数据做校验和运算
bool fill_cache = true; // 是否缓存这次查询结果(如果是做大块数据的扫描/遍历,那么最好设为false)
const Snapshot* snapshot = nullptr; // 指定从哪次快照中执行查询,为null则表示最新的状态查询
}
struct WriteOptions {
// 是否用同步的方式写入,若为true写入操作将会阻塞到数据成功存储到文件中
// 若为false,则机器崩溃后可能会丢失最近写入的数据
// 但如果只是程序崩溃,不是机器reboot,那么即使为false也不会丢失最近写入的数据
bool sync = false;
}
status错误代码
class Status {
public:
// 运行成功
bool ok() const;
// 未找到错误
bool IsNotFound() const;
// 崩溃错误
bool IsCorruption() const
// IO错误
bool IsIOError() const;
// 不支持错误
bool IsNotSupportedError() const;
// 参数非法错误
bool IsInvalidArgument() const;
};
Slice
Slice可以和string和char*类型相互转换,这里为了减少数据拷贝,Slice只保存传入的字符串的指针,所以string转换为Slice需要注意string对象的生存周期
class Slice {
public:
Slice(const char* s) : data_(s), size_(strlen(s)) {}
Slice(const std::string& s) : data_(s.data()), size_(s.size()) {}
std::string ToString() const { return std::string(data_, size_); }
const char* data() const { return data_; }
private:
const char* data_;
size_t size_;
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)