Key-Value 數據庫:iNexus
iNexus (簡稱ins) 是一個基于 Raft 協議實現的高可用的分布式 Key-Value 數據庫,支持數據變更通知(Watch)和分布式鎖,可用于大型分布式系統的協調工作。
使用說明:
https://github.com/fxsjy/ins/wiki
1. 初始化 Client
using namespace galaxy::ins::sdk; InsSDK* sdk = new InsSDK("abc.com:1234,def.com:1234") //構造函數傳入ins集群的若干個member(機器名+端口), 用逗號分隔。
2. 隨機讀
galaxy::ins::sdk::SDKError err; std::string key = "key_123"; std::string value; bool ret = sdk->Get(key, &value, &err)); // ret == true表示成功讀取 // ret == false表示讀取失敗或者改key不存在 // err返回錯誤碼,kOK表示無錯誤, kNoSuchKey表示key不存在(具體參見ins_sdk.h)。
std::string start_key = "a"; std::string end_key = "z"; galaxy::ins::sdk::ScanResult* result = sdk->Scan(start_key, end_key); //不包含end_key while (!result->Done()) { //通過一個流式迭代器讀取scan的結果 assert(result->Error() == galaxy::ins::sdk::kOK); std::string value = result->Value(); std::string key = result->Key(); result->Next(); }
galaxy::ins::sdk::SDKError err; std::string lock_name = "/ps/se/ac"; sdk->Lock(lock_name, &err); // Lock會一直阻塞直到搶到鎖 // sdk通過心跳和iNexus集群保持活躍,一旦超過一定時間(默認6秒),該sdk加的鎖自動失效,可以被其他client搶得。 sdk->TryLock(lock_name, &err); // TryLock不會阻塞,如果調用者搶不到鎖,就返回false, 用戶自己決定重試策略
watch支持直接watch一個key,也支持watch 一些key的"父節點". galaxy::ins::sdk::SDKError err; sdk->Watch("/ps/se/tera/ts", OnChildrenChange, context, &err); //第二個參數是回調函數,第三個參數是回調函數可以用的用戶自定義數據 sdk->Watch("/ps/se/tera/master_lock", OnLockChange, context, &err);
快速體驗:
(只需要一臺機器,通過多個進程模擬分布式)
cd sandbox ./start_all.sh ./ins_shell.sh galaxy ins> help show [ show cluster ] put (key) (value) [ update the data ] get (key) [read the data by key ] delete (key) [remove the data by key] scan (start-key) (end-key) [scan from start-key to end-key(excluded)] watch (key) [event will be triggered once value changed or deleted] lock (key) [lock on specific key] enter quit to exit shell
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!