iNexus

Key-Value 数据库
授权协议 BSD
开发语言 C/C++
所属分类 数据库相关、 NoSQL数据库
软件类型 开源软件
地区 国产
投 递 者 利永年
操作系统 Linux
开源组织
适用人群 未知
 软件概览

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)。

   3. 区间扫描

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();
}

   4. 分布式锁

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, 用户自己决定重试策略

   5. Watch数据变更

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
 相关资料
  • value绑定将ViewModel的参数绑定在form元素中,当form元素与ViewModel的属性建立关联之后,form元素的改变将会直接修改ViewModel的数据。 示例代码: //.W片段 <p>Login name: <input bind-value="userName" /></p> <p>Password: <input type="password" bind-value="

  • 数据库类型 dbm.gnu dbm.ndbm dbm.dumb 创建一个新的数据库 # dbm_new.py import dbm with dbm.open('/tmp/example.db', 'n') as db: db['key'] = 'value' db['today'] = 'Sunday' db['author'] = 'Doug' # dbm_whic

  • 问题内容: 我有两个表view_shipment_order_release和order_release_remark。当给定的order_release_gid的order_release_remark中没有记录时,则不会显示任何数据。我想在view_shipment_order_release中显示数据,即使order_release_remark中没有数据也是如此。我怎样才能做到这一点?我的

  • 这是将参数传递给方法的默认机制。 在此机制中,调用方法时,会为每个值参数创建新的存储位置。 将实际参数的值复制到它们中。 因此,对方法内部参数所做的更改对参数没有影响。 以下示例演示了该概念 - using System; namespace CalculatorApplication { class NumberManipulator { public void swap(in

  • 此绑定用于将相应DOM元素的值链接到ViewModel属性。 大多数情况下,它与input , select和textarea等元素一起使用。 这类似于文本绑定,不同之处在于,值绑定数据可以由用户更改,ViewModel将自动更新它。 Syntax value: <binding-value> Parameters HTML DOM元素的value属性设置为参数值。 较早的值将被覆盖。 如果参数

  • 问题内容: 我有一个包含域名的MySQL表: 我希望能够在此表中搜索完整的主机名(即“ www.google.com”)。如果是表格包含完整URL的相反方法,我将使用: 但是,倒数并不是那么简单。我目前的想法是搜索完整的主机名,然后逐步剥离域的每个部分,然后再次搜索。(即先搜索“ www.google.com”,然后搜索“ google.com”) 这不是特别有效或巧妙的方法,必须有更好的方法。我

  • 问题内容: 我想做一些域验证 在我的对象中,我有一个整数, 现在我的问题是我是否写 和 如果是整数,则哪一个适合域验证。 有人可以解释一下两者之间的区别吗? 谢谢。 问题答案: 和用于验证数字字段,其可以被(代表数字), ,, 等和它们各自的原始包装。 用于检查字段的长度约束。 按照文档的支持,,和而和支持原语及其包装。请参阅文档。

  • Checks if the element has a given class name in the list of class names applied to it. Parameters valuestringclass name Returns: boolean true if the element has given class