天天看点

leveldb学习笔记之一——clion调用leveldb使用示例

前言

2018年杀入区块链,算是接触了分布式、数据存储这一系列的知识,前段时间接触某手机厂商的技术人员,才发现自己在存储方面知识的不足,因此这段时间准备沉下心来学习学习。接下来就从leveldb开始,来研究研究其相关机制,不求看的人多,但求自勉而已。

而立未立,却又要进入人到中年的尴尬,但是不管到什么年级,对于一个it从业人员来说,提升技术都不可辜负!

工具选择

工欲善其事必先利其器,高效的工具能让人事半功倍。

  • 源码阅读工具

    我选择sourceinsight,无他,唯熟尔。十年前还在上大学的时候就已经在用了,用来阅读源码一直觉得很顺手,喜欢的小伙伴可以试试。

  • 调试编译工具

    关于调试编译工具,我选择clion,和对sourceinsight熟悉相反,刚好我对clion不怎么熟悉,以前在linux下都是使vim,编译调试使用gcc gdb就ok了,这次算是借着这个机会学一项新技能。

安装leveldb

下载源码

通过以下命令从github上面拉下源码

git clone https://github.com/google/leveldb      

编译源码

此处为linux编译方式,如在windows下编译,按照github上面的说明进行即可。

在源码目录下调用以下命令:

mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .      

编译成功后在build目录下能看到一个libleveldb.a的库文件。

##安装

通过如下命令进行安装

sudo make install      

在clion导入leveldb库

打开clion,创建一个工程,在工程目录下,有一个CMakeLists.txt,我们通过此文件导入要调用的leveldb库。此文件的内容如下:

cmake_minimum_required(VERSION 3.6)
project(useLevelDb)              #useLevelDb为我的工程名
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
set(INC_DIR /usr/local/include)  #新加行,设置leveldb头文件所在位置
add_executable(useLevelDb ${SOURCE_FILES})
set(CMAKE_EXE_LINKER_FLAGS
        "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,/usr/local/lib") #新加行,编译选项,添加库路径
include_directories(${INC_DIR}) #新加行,设置头文件目录
target_link_libraries(useLevelDb libleveldb.a) #新加行,链接库,格式为target_link_libraries(工程名 库名)
find_package(Threads REQUIRED)#新加行,依赖于threads库
target_link_libraries(useLevelDb Threads::Threads)#新加行,链接库      

对照上述文件进行修改即可。

源码示例

新建main.cpp,编写如下源码:

#include <cassert>
#include <iostream>
#include "./leveldb/db.h"

int main() {
    leveldb::DB *db;
    leveldb::Options options;
    options.create_if_missing = true;
    leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
    assert(status.ok());

    std::cout << "leveldb open success!" << std::endl;

    std::string value;
    std::string key1 = "testkey1";
    leveldb::Status s = db->Get(leveldb::ReadOptions(), key1, &value);
    if (s.IsNotFound()) {
        std::cout << "can not found for key:" << key1 << std::endl;
        db->Put(leveldb::WriteOptions(), key1, "testvalue1");
    }

    s = db->Get(leveldb::ReadOptions(), key1, &value);
    if (s.ok()) {
        std::cout << "found key:" << key1 << ",value:" << value << std::endl;
    }
    s = db->Delete(leveldb::WriteOptions(), key1);
    if (s.ok()) {
        std::cout << "delete key success which key:" << key1 << std::endl;
    }
    s = db->Get(leveldb::ReadOptions(), key1, &value);
    if (s.IsNotFound()) {
        std::cout << "can not found after delete for key:" << key1 << std::endl;
    }

    delete db;

    //std::cout << "Hello, World!" << std::endl;
    return 0;
}