我们要了解一种新兴事物,有两种方式:一种是直接去分析其内部原理,然后掌握了在对其进行使用;一种是直接先使用,然后在通过使用的体验来了解其内部原理。我比较喜欢第二种方式,这样可以现在感官上对这个新东西又个概念,而不是单纯的字面意思。这样理解起来就没有那么生硬和突兀。我觉得最好的方法就是你去使用下,然后约到问题来解决,这样就能实地的了解和这个东西。
1、从github上下载rocksdb源码
[root@localhost home]# git clone [email protected]:facebook/rocksdb.git
正克隆到 'rocksdb'...
Warning: Permanently added the RSA host key for IP address '13.250.177.223' to the list of known hosts.
remote: Counting objects: 62267, done.
remote: Compressing objects: 100% (67/67), done.
接收对象中: 58% (36494/62267), 84.72 MiB | 40.00 KiB/s
remote: Total 62267 (delta 38), reused 41 (delta 21), pack-reused 62174
接收对象中: 100% (62267/62267), 109.65 MiB | 81.00 KiB/s, done.
处理 delta 中: 100% (46704/46704), done.
2、编译
[root@localhost rocksdb]# make static_lib -j2
GEN util/build_version.cc
GEN util/build_version.cc
CC cache/clock_cache.o
CC cache/lru_cache.o
CC cache/sharded_cache.o
CC db/builder.o
CC db/c.o
CC db/column_family.o
CC tools/ldb_cmd.o
CC tools/ldb_tool.o
CC tools/sst_dump_tool.o
CC utilities/blob_db/blob_dump_tool.o
AR librocksdb.a
ar: 正在创建 librocksdb.a
[root@localhost rocksdb]#
编译完成之后会在rocksdb目录下生成librocksdb.a,这里提供了本身rocksdb提供的对外接口,如打开DB, put,get接口。这样外部进程可以通过这些接口对rocksdb进行访问了。
[root@localhost rocksdb]# ls -lh librocksdb.a
-rw-r--r--. 1 root root 364M 3月 24 23:53 librocksdb.a
[root@localhost rocksdb]#
3、怎么使用
在rocksdb源码中其实已经有了example来看怎么使用rocksdb,在/home/rocksdb/examples目录下有如下一些example实例可以参考。但是我这里写了一个非常简单的ocksdb_example.cc,就是打开数据库,然后写入一个数据,然后读取这个数据。
rocksdb_example.cc
#include
#include
#include "rocksdb/db.h"
#include "rocksdb/options.h"
using namespace rocksdb;
std::string kDBPath = "/tmp/rocksdb_simple_example";
int main() {
DB* db;
Options options;
// create the DB if it's not already present
options.create_if_missing = true;
// open DB
Status s = DB::Open(options, kDBPath, &db);
assert(s.ok());
// Put key-value
s = db->Put(WriteOptions(), "key1", "example value");
assert(s.ok());
std::string value;
// get value
s = db->Get(ReadOptions(), "key1", &value);
assert(s.ok());
std::cout<<"Get key1 from rocksdb database,value is :("<
编译example,这里由于会依赖其他库文件,因此编译的时候需要-l链接进来
[root@localhost examples]# g++ rocksdb_example.cc -o rocksdb_example ../librocksdb.a -I../include -O2 -std=c++11 -lpthread -lrt -lsnappy -lz -lnuma -ltcmalloc
[root@localhost examples]# ls -lh rocksdb_example
-rwxr-xr-x. 1 root root 77M 3月 25 00:18 rocksdb_example
[root@localhost examples]#
执行这个example,上面代码中写入了一个kv("key1","example value")值,然后读取这个key1的值,最终打印出来。
[root@localhost examples]# ./rocksdb_example
Get key1 from rocksdb database,value is :(example value)
[root@localhost examples]#
4、其实在目录(/tmp/rocksdb_simple_example)下生成了如下文件。
这些文件到底是什么意思?代表什么?我们接下来的文章会专门来理解
[root@localhost rocksdb_simple_example]# ls -lh
总用量 152K
-rw-r--r--. 1 root root 39 3月 25 00:26 000003.log
-rw-r--r--. 1 root root 16 3月 25 00:26 CURRENT
-rw-r--r--. 1 root root 37 3月 25 00:26 IDENTITY
-rw-r--r--. 1 root root 0 3月 25 00:26 LOCK
-rw-r--r--. 1 root root 15K 3月 25 00:26 LOG
-rw-r--r--. 1 root root 13 3月 25 00:26 MANIFEST-000001
-rw-r--r--. 1 root root 4.5K 3月 25 00:26 OPTIONS-000005
[root@localhost rocksdb_simple_example]#
5、总结:
到此你应该对rocksdb有了一个基本的认识了吧。接下来,我们就要去研究怎么打开数据库?怎么写?怎么读?他里面内部结构是怎么样的?compaction是什么?为什么要这样设计?目的是什么?什么叫LSM?等等。我们需要一步一步的去了解。