2012
Mar
21

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 的内容。

修改 Makefile 内容

  1. 106 LIBRARY = libleveldb.a 改成 LIBRARY = libleveldb.so
  2. 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 。

  1. #include "leveldb/db.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. //using namespace leveldb;
  6.  
  7. int main(){
  8. leveldb::DB *db;
  9. leveldb::Options option;
  10. option.create_if_missing = true;
  11. leveldb::DB::Open(option,"/tmp/leveldb_t",&db);
  12. string key="t2";
  13. string value="test";
  14. db->Put(leveldb::WriteOptions(), key, value);
  15.  
  16. string res;
  17. db->Get(leveldb::ReadOptions(), key, &res);
  18. cout << "get value = " << res << endl;
  19. delete db;
  20. return true;
  21. }
  22.  

编译与执行 command 如下:

  • g++ test.cc -lleveldb -lpthread
  • ./a.out

leveldb options

现在我们来看看 leveldb 有那些 options 可以调整,设定的方式如下。

  1. leveldb::Options option;
  2. 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 的资料,不过速度上会受到一些影响。
  1. leveldb::WriteOptions writeable;
  2. writeable.sync=true;
  3. db->Put(writeable, key, value);

leveldb效能

Google 自已说 leveldb 执行的速度很快、很优,上面这个连结是他们自已的测试结果,看起来是还蛮快的,不过在处理大 bytes 的数值时,效能就比较差了。

参考资料


回應 (Leave a comment)