我们要了解一种新兴事物,有两种方式:一种是直接去分析其内部原理,然后掌握了在对其进行使用;一种是直接先使用,然后在通过使用的体验来了解其内部原理。我比较喜欢第二种方式,这样可以现在感官上对这个新东西又个概念,而不是单纯的字面意思。这样理解起来就没有那么生硬和突兀。我觉得最好的方法就是你去使用下,然后约到问题来解决,这样就能实地的了解和这个东西。

1、从github上下载rocksdb源码

[root@localhost home]# git clone git@github.com: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 <string>
#include <iostream>
#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 :("<<value<<")"<<std::endl;


  delete db;


  return 0;
}

编译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?等等。我们需要一步一步的去了解。




Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐