笔者的开发环境是Centos7,不过相信Linux环境下的都不会有问题。
1.用git将代码从github上clone到本地(rocksdb的github: https://github.com/facebook/rocksdb.git )。
2.在父目录下输入shell命令编译文件: make static_lib
3.编译所有示例文件: cd examples; make all
此为RocksDB的一个简单的示例程序,相信对照注释很容易理解:
#include <cstdio>
#include <string>
#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"
using namespace std;
//数据库存储的路径
std::string kDBPath = "/tmp/rocksdb_simple_example";
int main(){
DB * db;
Options options;
//增加并发和水平压实风格
options.IncreaseParallelism();
options.OptimizieLevelStyleCompaction();
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","value");
assert(s.ok());
std::string value;
//get value
s = db->Get(ReadOptions(),"key1",&value);
assert(s.ok());
assert(value == "value");
//将一组更新原子化
{
WriteBatch batch;
batch.Delete("key1");
batch.Put("key2",value);
s = db->Write(WriteOption(),&batch);
}
s = db->Get(ReadOptions(),"key1",&value);
assert(s.IsNotFound());
db->Get(ReadOptions(),"key2",&value);
assert(value=="value");
{
PinnableSlice pinnable_val;
db->Get(ReadOptions(),db->DefaultColumnFamily(),"key2",&pinnable_val);
assert(pinnable_val=="value");
}
{
std::string string_val;
//如果无法锁定值,则将该值复制到其内部缓冲区
//内部缓冲区可以在构造时设置
PinnableSlice pinnable_val (&string_val);
db->Get(ReadOptions(),db->DefaultColumnFamily(),"key2",&pinnable_val);
assert(pinnable_val=="value");
//如果值没被固定,则一定在内部缓冲区里
assert(pinnable_val.IsPinned()||string_val=="value");
}
PinnalbeSlice pinnable_val;
db->Get(ReadOptions(),db->DefaultColumnFamily(),"key1",&pinnable_val);
assert(s.IsNotFound());
//每次使用之后和每次重新使用之前重置PinnableSlice
pinnable_val.Reset();
db->Get(ReadOptions(),db->DefaultColumnFamily(),"key2",&pinnable_val);
assert(pinnable_val == "value");
pinnable_val.Reset();
//在这之后,pinnable_val指向的Slice无效。
delete db;
return 0;
}
有些读者可能对第2步感觉有疑问,其实在Example中的Makefile文件中指定了:
librocksdb:
cd .. && $(MAKE) static_lib
当然相应地指定了:
all: simple_example column_families_example compact_files_example c_simple_example optimistic_transaction_example transaction_example compaction_filter_example options_file_example
更多细节可以阅读一下源文件。