天天看點

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;
}