LevelDB是一个开源的键值存储库,由Google开发,用于提供快速的持久化存储。LevelDB使用B树作为底层存储结构,支持高效地写入、更新和读取数据。它支持多个并发读取操作和单个写操作,因此非常适合用于高并发的应用程序。LevelDB可以在Linux、Windows和Mac OS X等多个平台上运行,并提供了多种编程语言的API,如C++、Java、Python、Node.js等,使得开发者可以轻松地将其集成到自己的应用程序中。LevelDB被广泛用于各种应用场景,如分布式存储、缓存、日志存储等。
git clone https://github.com/google/leveldb
cmake -Bbuild_ninja -DCMAKE_INSTALL_PREFIX=`pwd`/install
cmake --build build_ninja
// 打开数据库
Status DB::Open(const Options& options, const std::string& dbname, DB** dbptr);
// 添加/修改 数据
Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value)
// 查询数据
Status DBImpl::Get(const ReadOptions& options, const Slice& key,
std::string* value);
// 删除数据
Status DB::Delete(const WriteOptions& opt, const Slice& key)
#include
enum DbStatus{
DB_Error_UnKnown = -1,
DB_OK = 0,
DB_Error_NotFound = 1,
DB_Error_Corruption = 2,
DB_Error_NotSupported = 3,
DB_Error_InvalidArgument = 4,
DB_Error_IOError = 5
};
class LevelMaria{
public:
explicit LevelMaria(){}
void OpenDB(const std::string& dbpath){
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, dbpath, &_db);
if (!status.ok())
spdlog::info("open level db:{0} error:{1}", dbpath, status.ToString());
assert(status.ok());
}
void CloseDB(){
if(_db){
delete _db;
}
}
//put
DbStatus Put(const std::string &key, const std::string& value){
return DbStatus(_db->Put(leveldb::WriteOptions(), key, value).ErrorCode());
}
//get
DbStatus Get(const std::string &key, std::string &value){
return DbStatus(_db->Get(leveldb::ReadOptions(), key, &value).ErrorCode());
}
//delete
DbStatus Delete(const std::string &key){
return DbStatus(_db->Delete(leveldb::WriteOptions(), key).ErrorCode());
}
//read all
void ReadAll(){
leveldb::Iterator* it = _db->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
spdlog::info("key:{0} value:{1}", it->key().ToString() , it->value().ToString());
}
assert(it->status().ok()); // Check for any errors found during the scan
delete it;
}
private:
leveldb::DB *_db{nullptr};
};
#include
#include
std::string time_string(std::time_t posix){
char bq[20];
std::tm tp = *std::localtime(&posix);
return {bq, std::strftime(bq, sizeof(bq), "%F %T", &tp)};
}
std::string timeusec(){
auto now = std::chrono::system_clock::now();
auto us = std::chrono::duration_cast(now.time_since_epoch())%1000000;
std::ostringstream ss;
ss.fill('0');
ss << time_string(std::chrono::system_clock::to_time_t(now)) << '.' << us.count();
return ss.str();
}
int main(){
LevelMaria lma;
lma.OpenDB("monitor_level.db");
for(int i = 0; i < 5; i++){
#ifdef _WIN32
Sleep(1);
#else
usleep(1);
#endif
lma.Put(timeusec(), std::to_string(i));
}
lma.ReadAll();
lma.CloseDB();
}