leveldb入门

leveldb简介

 LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的嵌入式数据库,内部没有设计成C/S网络结构,必须和服务部署在同一台服务器。levelDB其实也是一个C++程序库,是可以可以被编译和链接到我们自己的程序中的库,而不是像Redis那样是一个数据库服务器。LevelDb本质上是一个存储引擎,即一套存储系统以及在这套存储系统上提供的一些操作接口。LevelDb有如下一些特点:
  • 首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,redis是一个内存数据库,它是将KV写入内存中,而LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上。从某种意义上说,redis是非持久化的,而levelDB是实时持久化的。
  • key、value支持任意的byte类型数组,不单单支持字符串
  • 其次,LevelDb在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleDb会按照用户定义的比较函数依序存储这些记录。
  • 再次,像大多数KV系统一样,LevelDb的操作接口很简单,基本操作包括写记录,读记录以及删除记录。也支持针对多条操作的原子批量操作。
  • 另外,LevelDb支持数据快照(snapshot)功能,使得读取操作不受写操作影响,可以在读操作过程中始终看到一致的数据。
  • 除此外,LevelDb还支持数据压缩等操作,这对于减小存储空间以及增快IO效率都有直接的帮助。
  • LSM典型实现,适合写多读少。

编译&安装

  • 源码下载
1
2
git clone https://github.com/google/leveldb.git
git submodule update --init
  • 执行编译
1
2
3
cd leveldb
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
  • 头文件加入系统目录(可选)
1
cp -r ./include/leveldb /usr/include/
  • 编写demo
  • 编译demo

g++ -o xxx xxx.cpp libleveldb.a -lpthread

测试程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <cassert>

#include "leveldb/db.h"
#include "leveldb/write_batch.h"

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

// Write data.
status = db->Put(leveldb::WriteOptions(), "name", "jinhelin");
assert(status.ok());

// Read data.
std::string val;
status = db->Get(leveldb::ReadOptions(), "name", &val);
assert(status.ok());
std::cout << val << std::endl;

// Batch atomic write.
leveldb::WriteBatch batch;
batch.Delete("name");
batch.Put("name0", "jinhelin0");
batch.Put("name1", "jinhelin1");
batch.Put("name2", "jinhelin2");
batch.Put("name3", "jinhelin3");
batch.Put("name4", "jinhelin4");
batch.Put("name5", "jinhelin5");
batch.Put("name6", "jinhelin6");
batch.Put("name7", "jinhelin7");
batch.Put("name8", "jinhelin8");
batch.Put("name9", "jinhelin9");
status = db->Write(leveldb::WriteOptions(), &batch);
assert(status.ok());

// Scan database.
leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
std::cout << it->key().ToString() << ": " <<
it->value().ToString() << std::endl;
}
assert(it->status().ok());

// Range scan, example: [name3, name8)
for (it->Seek("name3");
it->Valid() && it->key().ToString() < "name8";
it->Next()) {
std::cout << it->key().ToString() << ": " <<
it->value().ToString() << std::endl;
}

// Close a database.
delete db;
}

教程网站

leveldb源码阅读系列 - 知乎 (zhihu.com)

到处抄来的LevelDB笔记 - 知乎 (zhihu.com)


leveldb入门
https://macbook-pro-gala.github.io/2023/04/22/leveldb入门/
作者
lyh
发布于
2023年4月22日
许可协议