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