从今日起开始学习google大神开发的高性能key-value数据库leveldb,版本1.12,并不定期地分享学习心得。之所以取名为果断学习,是有点给自己施压的意思,其实很早就想学了,只是由于时间关系拖到现在。如今要狠下心来把此开源技术吃透,并不一定要懂得全部源码,但要知道它是怎么设计的,这一点为什么要这么做,设计者是怎么想的等等,这才是真正应该学习的地方。
基本介绍网上都有,我就不说太多了。虽然个人学习免不了要先学习别人的,但既然自己要做,就要做得个性化,把别人东西直接复制粘贴这种事,懒得做;学习顺序还是老规矩,先模仿编译、写个示例,体验一下,有个感性认识,其余任何文字介绍都以后再说!当然啦,既然是用C++写的,读者肯定得要懂C++了,否则看起来就很吃力了。
好,我在这里找了个示例代码,包装如下:
#include <iostream> #include <cassert> #include "leveldb/db.h" using namespace std; //以下用到的类型都在leveldb中,所以事先声明 //如果有类型名称碰巧与其它库冲突,可在其前 //加上域解析符 using namespace leveldb; int main() { DB* db; Options opt; opt.create_if_missing = true; string dbpath = "dbpath";//数据库数据目录,自己指定 Status s = DB::Open(opt,dbpath,&db); assert(s.ok()); cout << "db open ok\n"; //key-value键值对 string key = "name"; string val = "cshi"; string val2; //写入 s = db->Put(WriteOptions(),key,val); if (s.ok()) //读出 s = db->Get(ReadOptions(),key,&val2); cout << "value:" << val2 << endl; <span style="white-space:pre"> </span>delete db; return 0; }
上述文件起名为test.cpp,放在了leveldb-1.12/mycode下,源码已经由make编译生成了相应的静态与动态库libleveldb.a和leveldb.so.*
为方便起见,随手写了个makefile,如下:
test:test.cpp g++ -o $@ $< -g -I../include ../libleveldb.a -lpthread
生成test执行文件后,终端执行:
此时我们查看dbpath文件夹后就会发现生成了以下文件:
000003.log CURRENT LOCK LOG MANIFEST-000002
至于文件是干嘛的,不如放在下一节讲吧。从字面上看,log是日志文件,表明干了什么操作,LOCK貌似属于锁,不知道锁什么,CURRENT,MANIFEST就猜不出啥了。
在这顺便吐槽一下百度的搜索,输入leveldb结果中竟然没有官方网站(http://leveldb.org/),其排名有这么低吗?我还是bing中搜到的。。