leveldb 是一套 key-value 的资料存取工具,leveldb会将资料储存在档案里,另外也会暂存部分资料在 memory 以加快读取效率,虽然 leveldb 的名称中有 db ,不过他的功能跟一般 database 的功能可以差很多的,并且 leveldb 无法远端来存取资料,也就是非 client-server 的机制,它只能在本机执行,当然你也可以自已帮它写个 server 去取存罗!! Google 的说明资料中还有一项比较重要的点,[Only a single process (possibly multi-threaded) can access a particular database at a time. ],中文是说一次只能一个 process 存取,看起来像是他会自动 lock , 如果限制一个 process , 这样就可以百分之分确保一次只有一个 process 在修改资料。
安装 leveldb
先用 git 从 google repository 将原始码抓回来,接著使用 make 就能编译完成罗,预设的 Makefile 里会使用 static library 方式编译成 libleveldb.a 的档案,不过我不喜欢使用 statis library,我喜欢用 shared library ,所以我修改 Makefile 的内容。
- git clone https://code.google.com/p/leveldb/ (取得原始码)
修改 Makefile 内容
- 106 行 LIBRARY = libleveldb.a 改成 LIBRARY = libleveldb.so
- 121 行 $(AR) -rs $@ $(LIBOBJECTS) 改成 gcc -shared -fPIC -o $@ $(LIBOBJECTS)
改完后,重新 make 就会看到 libleveldb.so 这个档案了,那就把这个档案复制到 system link libraries 里吧,我将 libleveldb,so cp 到 /usr/local/lib ,再把 (leveldb root)/include/leveldb 复制到 /usr/local/include/ ,最后执行 sudo ldconfig,更新系统的 library 进结,这样就完成 shared library 的 libleveldb 罗,对了你要检查一下 /etc/ld.so.conf 这档案里有没有包含路径 /usr/local/lib。
- make
- cp libleveldb /usr/local/lib/
- cp -r include/leveldb /usr/local/include/
- sudo ldconfig
leveldb 使用方式
基本功能有新增,删除,修改,取得资料,使用方式很简单,先要知道 leveldb的 namespace 是 「leveldb」,所以呼叫它的功能时,都要加上 「leveldb::」,接下来介绍一些简单的使用方式。
- 宣告 leveldb : leveldb::DB *db;
- 宣告 leveldb option : leveldb::Options option;
- 打开 leveldb : leveldb::DB::Open(option,"/tmp/leveldb_t",&db);
- 写入一个 key : db->Put(leveldb::WriteOptions(), key, value);
- 取得一个 key : db->Get(leveldb::ReadOptions(), key, &str); ,str 的型态为 string
实际写一小段 code 来测试一下存取功能, file:test.cc 。
- #include "leveldb/db.h"
- #include <iostream>
- using namespace std;
- //using namespace leveldb;
- int main(){
- leveldb::DB *db;
- leveldb::Options option;
- option.create_if_missing = true;
- leveldb::DB::Open(option,"/tmp/leveldb_t",&db);
- string key="t2";
- string value="test";
- db->Put(leveldb::WriteOptions(), key, value);
- string res;
- db->Get(leveldb::ReadOptions(), key, &res);
- cout << "get value = " << res << endl;
- delete db;
- return true;
- }
编译与执行 command 如下:
- g++ test.cc -lleveldb -lpthread
- ./a.out
leveldb options
现在我们来看看 leveldb 有那些 options 可以调整,设定的方式如下。
- leveldb::Options option;
- option.create_if_missing = true;
- create_if_missing : 如果 leveldb 的file 不存在,则自动建立 file。
- error_if_exists : 如果 leveldb 的file 已存在,又尝试建立的话,则弹出 error。
- write_buffer_size : 预设是 4MB ,储存在 memory 的最大空间。
- max_open_files : leveldb最多可以使用的档案数,一个档案可以储存 2MB 的资料。
- 写入时同步 cache 的资料:预设 leveldb 会自动cache key-value 的数值,所以修改 value 时,有可能会因为 cache 的原因,而抓不到最新的 value ,这时可以设定 sync=true,这样每次更新 value 时,就自动更新 cache 的资料,不过速度上会受到一些影响。
- leveldb::WriteOptions writeable;
- writeable.sync=true;
- db->Put(writeable, key, value);
leveldb效能
Google 自已说 leveldb 执行的速度很快、很优,上面这个连结是他们自已的测试结果,看起来是还蛮快的,不过在处理大 bytes 的数值时,效能就比较差了。