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/
|
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() { leveldb::DB* db; leveldb::Options opts; opts.create_if_missing = true; leveldb::Status status = leveldb::DB::Open(opts, "./testdb", &db); assert(status.ok()); status = db->Put(leveldb::WriteOptions(), "name", "jinhelin"); assert(status.ok()); std::string val; status = db->Get(leveldb::ReadOptions(), "name", &val); assert(status.ok()); std::cout << val << std::endl; 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()); 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()); for (it->Seek("name3"); it->Valid() && it->key().ToString() < "name8"; it->Next()) { std::cout << it->key().ToString() << ": " << it->value().ToString() << std::endl; } delete db; }
|
教程网站
leveldb源码阅读系列 - 知乎 (zhihu.com)
到处抄来的LevelDB笔记 - 知乎 (zhihu.com)