rocksdb 用法簡單介紹
-
RocksDB是使用C++編寫的嵌入式kv存儲引擎,其鍵值均允許使用二進制流。由Facebook基於levelDB開發, 提供向后兼容的levelDB API。
RocksDB針對Flash存儲進行優化,延遲極小。RocksDB使用LSM存儲引擎,純C++編寫。 -
打開一個數據庫
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok()); -
往數據庫寫入kv鍵值對
s = db->Put(WriteOptions(), "k1", "v1"); -
向數據庫查詢k的value
s = db->Get(ReadOptions(), "k1", &v); -
原子寫入
rocksdb::WriteBatch batch;
batch.Delete("k1");
batch.Put("k2", "v2");
s = db->Write(rocksdb::WriteOptions(), &batch); -
迭代器
db->NewIterator(rocksdb::ReadOptions());
可以通過在調用NewIterator的時候,給傳入的option設定ReadOptions.iterate_upper_bound來為你的迭代范圍設置一個上邊界。
通過這個設定,rocksdb就不用繼續查找這個key之后的內容了。在一些情況下,可以節省一些IO和計算。在特定的工作載荷下,
它帶來的改善是顯著的。這個選項可以同在正向和反向迭代。rocksdb::Iterator* it = db->NewIterator(rocksdb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
cout << it->key().ToString() << ": " << it->value().ToString() << endl;
} -
事務操作
Status s = TransactionDB::Open(options,txn_db_options,kDbPathTran,&txn_db );
Transaction* txn = txn_db->BeginTransaction(WriteOptions());
獲得事務,就可以進行相應的op操作,如下:
s = txn->Put("key", "value");
s = txn->Delete("key2");
然后對事務進行提交
s = txn->Commit();
rocksdb實際用法如以下代碼
#include<cstdio>
#include<string>
#include<iostream>
#include "rocksdb/db.h"
#include "rocksdb/slice.h"
#include "rocksdb/options.h"
#include "rocksdb/utilities/transaction.h"
#include "rocksdb/utilities/transaction_db.h"
using namespace rocksdb;
std::string kDbPath = "/tmp/wsf_rocksdb_test";
std::string kDbPathTran = "/tmp/wsf_rocksdb_transation";
void testTransaction(){
TransactionDB* txn_db;
Options options;
TransactionDBOptions txn_db_options;
options.create_if_missing = true;
Status s = TransactionDB::Open(options,txn_db_options,kDbPathTran,&txn_db );
Transaction* txn = txn_db->BeginTransaction(WriteOptions());
s = txn->Put("key", "value");
s = txn->Delete("key2");
s = txn->Merge("key3", "value");
s = txn->Commit();
delete txn;
}
int main()
{
DB *db;
Options options;
options.create_if_missing = true;
Status s = DB::Open(options, kDbPath, &db);
assert(s.ok());
s = db->Put(WriteOptions(), "k1", "v1");
assert(s.ok());
std::string v;
s = db->Get(ReadOptions(), "k1", &v);
assert(s.ok());
std::cout << "v = " << v << std::endl;
rocksdb::WriteBatch batch;
batch.Delete("k1");
batch.Put("k2", "v2");
batch.Put("k3", "v3");
batch.Put("k4", "v4");
s = db->Write(rocksdb::WriteOptions(), &batch);
if (s.ok()) {
std::string v2;
s = db->Get(ReadOptions(), "k2", &v2);
std::cout << "v = " << v2 << std::endl;
s = db->Get(ReadOptions(), "k1", &v);
if (!s.ok()) {
std::cout << s.ToString() << std::endl;
}
// assert(s.ok());
//std::cout<<"v = "<<v<<std::endl;
}
rocksdb::Iterator * it = db->NewIterator(rocksdb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
std::cout << it->key().ToString() << ":" << it->value().
ToString() << std::endl;
}
testTransaction();
}