leveldb 的部署和使用

本文详细介绍了leveldb的部署过程,包括在C++和Python环境下的安装步骤,以及在Mac和CentOS上的经验分享。文章还探讨了leveldb的主要功能,如open、put、get和Iterator,并通过文件解析展示了数据库目录结构和文件内容。在宏观视角下,作者分析了首次打开数据库时的文件解析情况,解释了各个文件的作用。最后,文章讨论了多次写入数据后数据库的变化。

1. leveldb 的部署和使用

1.1. 部署

部署比较简单,按照官网即可

1.1.1. C++

git clone --recurse-submodules https://github.com/google/leveldb.git
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
make install

1.1.2. python

pip install leveldb

1.1.3. 小插曲

开始用 mac 部署,遇到挺多问题,不管是brew安装还是编译安装都有

  • leveldb/db.h file not found

实际上在 /usr/local/include/leveldb/db.h 是存在的

stat /usr/local/include/leveldb/db.h
16777221 47682495 -rw-r--r-- 1 root admin 0 6803 "Apr  5 14:55:15 2021" "Apr  5 14:52:17 2021" "Apr  5 14:55:15 2021" "Apr  5 14:52:17 2021" 4096 16 0 /usr/local/include/leveldb/db.h

起初一直怀疑是因为路径问题,查看路径是正确的

clang -x c -v -E /dev/null
# ---
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.15.0 -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -Werror=implicit-function-declaration -E -disable-free -disable-llvm-verifier -discard-value-names -main-file-name null -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=all -fno-strict-return -masm-verbose -munwind-tables -target-sdk-version=10.15.6 -fcompatibility-qualified-id-block-type-checking -target-cpu penryn -dwarf-column-info -debugger-tuning=lldb -target-linker-version 609.8 -v -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -I/usr/local/include -internal-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/local/include -internal-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0/include -internal-externc-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include -internal-externc-isystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-c99-designator -Wno-final-dtor-non-final-class -Wno-extra-semi-stmt -Wno-misleading-indentation -Wno-quoted-include-in-framework-header -Wno-implicit-fallthrough -Wno-enum-enum-conversion -Wno-enum-float-conversion -fdebug-compilation-dir /Users/wanggangfeng/work/tstack-code/practice/cpp-prectice/leveldbtest -ferror-limit 19 -fmessage-length 178 -stack-protector 1 -fstack-check -mdarwin-stkchk-strong-link -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fobjc-runtime=macosx-10.15.0 -fmax-type-align=16 -fdiagnostics-show-option -fcolor-diagnostics -o - -x c /dev/null
clang -cc1 version 12.0.0 (clang-1200.0.32.29) default target x86_64-apple-darwin19.6.0
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/local/include"
ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/Library/Frameworks"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks (framework directory)
End of search list.
# 1 "/dev/null"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 366 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/dev/null" 2

从新连接时链接报错

clang -Xlinker -v
# ----
@(#)PROGRAM:ld  PROJECT:ld64-609.8
BUILD 15:07:46 Dec 18 2020
configured to support archs: armv6 armv7 armv7s arm64 arm64e arm64_32 i386 x86_64 x86_64h armv6m armv7k armv7m armv7em
Library search paths:
	/usr/local/lib
	/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib
Framework search paths:
	/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

花了很多时间最终没有解决这个问题,最终在centos上一次性成功,后面开发工作都搞centos会比mac少出很多问题

1.2. 主要功能

  • open – 打开数据库
  • put – 插入数据
  • get – 获取数据
  • Iterator – 遍历数据

其他功能后面再列

1.3. 使用

C++ 参照

  • https://blog.youkuaiyun.com/joelcat/article/details/89240584
    python 参照
  • http://www.idcat.cn/leveldb-python%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95.html

1.4. 宏观视角

使用 DB::Open 之后会在本地生成一个数据库目录, 目录路径为db_path 代码中指定的是 /var/tmp/ldb1.ldb

leveldb::DB::Open(options, db_path, &ldbptr)
tree /var/tmp/ldb1.ldb
/var/tmp/ldb1.ldb
├── 000003.log
├── CURRENT
├── LOCK
├── LOG
└── MANIFEST-000002

1.4.1. 首次打开文件解析

首先看看每个文件里面有什么东西

  • 000003.log

看内容主要为刚刚写进去的键值,这个文件应该是数据库数据文件

hexdump -Cv 000003.log
00000000  71 69 19 21 20 00 01 01  00 00 00 00 00 00 00 01  |qi.! ...........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值