運行RocksDB的一個簡單示例(c++)

筆者的開發環境是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

更多細節可以閱讀一下源文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章