1,下載levelDB源碼
git clone https://github.com/google/leveldb.git
2,編譯LevelDB
cd leveldb & make all
編譯完成之後在當前目錄多了兩個目錄:out-shared和out-static
在out-static目錄下有我們需要的libleveldb.a
3,在當前目錄新建文件夾test
touch test; cd test
4,在test目錄新建測試代碼test.cpp
#include <assert.h>
#include <string.h>
#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::string k1 = "name";
std::string v1 = "jim";
status = db->Put(leveldb::WriteOptions(), k1, v1);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), k1, &v1);
assert(status.ok());
std::cout<<"k1:"<<k1<<"; v1:"<<v1<<std::endl;
std::string k2 = "age";
std::string v2 = "20";
status = db->Put(leveldb::WriteOptions(), k2, v2);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), k2, &v2);
assert(status.ok());
std::cout<<"k2:"<<k2<<"; v2:"<<v2<<std::endl;
status = db->Delete(leveldb::WriteOptions(), k2);
assert(status.ok());
std::cout<<"Delete k2.."<<std::endl;
status = db->Get(leveldb::ReadOptions(),k2, &v2);
if(!status.ok())
std::cerr<<"k2:"<<k2<<"; "<<status.ToString()<<std::endl;
else
std::cout<<"k2:"<<k2<<"; v2:"<<v2<<std::endl;
delete db;
return 0;
}
5,編譯前的準備
把libleveldb.a拷貝到當前目錄
cp ../out-static/libleveldb.a ./
把leveldb/include目錄添加到PATH :
cd ..; export PATH=$PATH:$(pwd)/include; cd test
6,編譯運行
編譯:
g++ -o test test.cpp libleveldb.a -lpthread -I../include
運行:
➜ test git:(master) ✗ ./test
k1:name; v1:jim
k2:age; v2:20
Delete k2..
k2:age; NotFound:
到目前爲止,我們就基本可以使用leveldb了。
9, 執行完.test之後,在/tmp/testdb下面產生了leveldb相關的文件:
➜ test git:(master) ✗ ls -alh /tmp/testdb
total 56
drwxr-xr-x 10 root wheel 340B 10 3 12:51 .
drwxrwxrwt 14 root wheel 476B 10 3 12:31 ..
-rw-r--r-- 1 root wheel 148B 10 3 12:14 000005.ldb
-rw-r--r-- 1 root wheel 148B 10 3 12:51 000008.ldb
-rw-r--r-- 1 root wheel 80B 10 3 12:51 000009.log
-rw-r--r-- 1 root wheel 16B 10 3 12:51 CURRENT
-rw-r--r-- 1 root wheel 0B 10 3 11:57 LOCK
-rw-r--r-- 1 root wheel 309B 10 3 12:51 LOG
-rw-r--r-- 1 root wheel 309B 10 3 12:14 LOG.old
-rw-r--r-- 1 root wheel 110B 10 3 12:51 MANIFEST-000007
8, 根據LevelDB官方網站的描述,LevelDB的特點和限制如下:
特點:1、key和value都是任意長度的字節數組;
2、entry(即一條K-V記錄)默認是按照key的字典順序存儲的,當然開發者也可以重載這個排序函數;
3、提供的基本操作接口:Put()、Delete()、Get()、Batch();
4、支持批量操作以原子操作進行;
5、可以創建數據全景的snapshot(快照),並允許在快照中查找數據;
6、可以通過前向(或後向)迭代器遍歷數據(迭代器會隱含的創建一個snapshot);
7、自動使用Snappy壓縮數據;
8、可移植性;
限制:
1、非關係型數據模型(NoSQL),不支持sql語句,也不支持索引;
2、一次只允許一個進程訪問一個特定的數據庫;
3、沒有內置的C/S架構,但開發者可以使用LevelDB庫自己封裝一個server;