筆者的開發環境是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
更多細節可以閱讀一下源文件。