标签:分布式 nosql 内存数据库 aerospike shard-nothing
查询时除了使用主索引,Aerospike C客户端也提供API来通过检索次索引查询数据库。
为了使用次索引查询数据,首先应初始化并填充一个as_query对象;然后,以初始化完成的as_query对象,使用aerospike_query_foreach()执行查询。一个查询可以:
此章节专注于第一种方式,如想了解第二种方式,请参见【聚合】章节。
后面的代码引用自示例目录【examples/query_examples/simple】,由Aerospike
C客户端安装包自带。
请先阅读:
首先,初始化和构建一个的查询对象。下面代码片断初始化了一个查询对象,要查找的数据所在的namespace名称为“test”、set名称为“demoset”,查找bin名是 "test-bin"且整型值等于7的记录。相当于SQL语句:“select
* from test.demoset where test-bin equal 7”。
as_query query;
as_query_init(&query, "test", "demoset");
as_query_where_inita(&query, 1);
as_query_where(&query, "test-bin", integer_equals(7));
注意:不带“where"语句的查询将导致全库扫描。
查询使用aerospike_query_foreach()函数调用。
此调用为集群中每个节点初始化一个查询任务。在C客户端内部,有5个(NUM_QUERY_THREADS)查询工作线程处理所有节点的查询任务。若集群多于5个节点,理想状态下是增加默认的处理线程数,以便让全部节点并行处理。
if (aerospike_query_foreach(&as, &err, NULL, &query, query_cb, NULL) !=
AEROSPIKE_OK) {
LOG("aerospike_query_foreach() returned %d - %s", err.code, err.message);
as_query_destroy(&query);
cleanup(&as);
exit(-1);
}
若在指定的查询目标上没有创建次索引,将返回”AEROSPIKE_ERR_INDEX_NOT_FOUND“错误。若一个索引正在创建中,将返回AEROSPIKE_ERR_INDEX_NOT_READABLE错误。
上面的示例中,aerospike_query_foreach()函数使用了一个回调函数query_cd做为参数。回调函数具有如下型构:
typedef bool (*aerospike_query_foreach_callback)(const as_val *value, void *udata);
对任何节点返回的每条记录,回调函数都被调起,来对记录进行处理。记录处理没有特定顺序。你可能注意到参数value是个const as_val *类型,意味着回调函数没有责任销毁它,它在回调函数的作用域内可见。回调函数不应将它传递到作用域之外。
没有更多需处理的返回结果时,将以空值(NULL)做为参数value的值,调用回调用函数。
当参数value期望是一个记录时,可简单地使用as_record_formval()转换成记录类型。若参数value是个记录,此函数返回一个记录对象;否则返回空值。也可使用as_val_type()检查value的类型。
bool callback(const as_val *value, void *udata) {
if (value == NULL) {
// query is complete
return true;
}
as_record *rec = as_record_fromval(value);
if (rec != NULL) {
// process record
}
return true;
}
若想在每次回调时传递一个全局对象出来,请在调用aerospike_query_foreach()时提供一个userdata类型的参数。
一旦查询结束,查询对象与其成员对象可使用as_query_destroy()函数安全地释放。注意在我们的示例中,可以不用显式调用as_query_destroy(),因为是从栈上分配的as_query对象,并且使用了as_query_where_inita(),来避免内部使用堆。
标签:分布式 nosql 内存数据库 aerospike shard-nothing
原文地址:http://blog.csdn.net/jj_tyro/article/details/45361979