欢迎投稿

今日深度:

AerospikeC客户端手册———查询—查询记录

AerospikeC客户端手册———查询—查询记录


查询记录

查询时除了使用主索引,Aerospike C客户端也提供API来通过检索次索引查询数据库。
为了使用次索引查询数据,首先应初始化并填充一个as_query对象;然后,以初始化完成的as_query对象,使用aerospike_query_foreach()执行查询。一个查询可以:
对返回的满足条件记录逐个调用回调函数。
对返回的满足条件记录集合应用流式用户定义函数(StreamUDF),再对StreamUDF返回结果调用回调用函数。

此章节专注于第一种方式,如想了解第二种方式,请参见【聚合】章节。

后面的代码引用自示例目录【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(),来避免内部使用堆。

www.htsjk.Com true http://www.htsjk.com/sybase/19592.html NewsArticle AerospikeC客户端手册———查询—查询记录 查询记录 查询时除了使用主索引,Aerospike C客户端也提供API来通过检索次索引查询数据库。 为了使用次索引查询数据,首先应初始化并填充一...
评论暂时关闭