前言
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;
}
今天算是leveldb学习的开端,接下来会对源码进行学习。
学习是一种慰藉,编程是一种情怀,技术提升永不可辜负!