level介绍与使用

本文介绍了LevelDB,Google开发的键值存储库,其使用B树结构,支持高并发,跨平台API丰富。文章详细讲解了leveldb的下载编译、接口介绍与使用示例,以及在实际项目中的应用.

leveldb介绍

LevelDB是一个开源的键值存储库,由Google开发,用于提供快速的持久化存储。LevelDB使用B树作为底层存储结构,支持高效地写入、更新和读取数据。它支持多个并发读取操作和单个写操作,因此非常适合用于高并发的应用程序。LevelDB可以在Linux、Windows和Mac OS X等多个平台上运行,并提供了多种编程语言的API,如C++、Java、Python、Node.js等,使得开发者可以轻松地将其集成到自己的应用程序中。LevelDB被广泛用于各种应用场景,如分布式存储、缓存、日志存储等。

1. leveldb下载编译

    git clone https://github.com/google/leveldb
    cmake -Bbuild_ninja -DCMAKE_INSTALL_PREFIX=`pwd`/install
    cmake --build build_ninja

2. leveldb接口介绍

    // 打开数据库
    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) 

3. leveldb 接口使用

    #include <leveldb/db.h>
    
    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};
};

4. 测试调用

#include <iostream>
#include <sstream>

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<std::chrono::microseconds>(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();
}
### 三级标题:Logback 日志级别配置详解 Logback 是 Java 应用中广泛使用的日志框架,其核心配置文件为 `logback.xml` 或 `logback-spring.xml`。通过配置日志级别,可以控制不同包或类的日志输出粒度,从而实现日志的精细化管理。 Logback 支持多种日志级别,包括 `TRACE`、`DEBUG`、`INFO`、`WARN` 和 `ERROR`,其中 `TRACE` 是最详细的日志级别,而 `ERROR` 则是最简略的。日志级别可以配置在 `<logger>` 或 `<root>` 标签中,用于控制特定包或全局的日志输出行为。 例如,以下配置定义了一个日志记录器,用于控制 `limeLogback.LogbackDemo` 类的日志打印级别为 `INFO`: ```xml <logger name="limeLogback.LogbackDemo" level="info" additivity="false"> <appender-ref ref="STDOUT"/> </logger> ``` 该配置表明该类的日志输出级别为 `INFO`,即不会输出 `DEBUG` 及以下级别的日志信息[^3]。 在全局配置中,根日志记录器(`<root>`)通常用于定义默认的日志级别和输出目标。例如: ```xml <root level="INFO"> <appender-ref ref="STDOUT"/> </root> ``` 此配置表示所有未被单独配置的类,其日志输出级别默认为 `INFO`,并通过 `STDOUT` Appender 输出日志[^1]。 Logback 还支持异步日志输出,通过 `AsyncAppender` 提升性能。例如: ```xml <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="STDOUT"/> </appender> ``` 异步输出机制可以显著减少日志记录对主线程的阻塞,适用于高并发场景下的日志处理[^2]。 此外,为了使用 Logback,需要在项目中引入其依赖包,例如: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> ``` 该依赖提供了 Logback 的核心功能,包括日志记录器、Appender 和 Layout 等组件[^4]。 通过合理配置日志级别,开发者可以有效地控制日志输出量,避免日志冗余,同时确保关键信息的可追踪性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值