Aerospike C客户端手册———数据扫描—记录扫描

记录扫描

Aerospike C客户端提供扫描指定namespace和set中所有记录的能力。

扫描可使用扫描API定义。使用扫描API,可以初始化和填充一个as_scan对象。

以初始化过的as_scan,可用下面任一个操作执行扫描:

  • aerospike_scan_foreach() — 执行扫描并对每个记录调用一个函数。
  • aerospike_scan_background() — 执行扫描但不要结果,提供检查扫描状态的能力。

使用foreach处理结果

函数aerospike_scan_foreach()执行扫描,对查找到的记录逐个调用回调函数。回调函数的型构是:

typedef bool (*aerospike_scan_foreach_callback)(const as_val *value, void *udata);

这个回调函数在扫描期间找到的每条记录上被调用,记录通过参数value传递,用户提供数据由参数udata传递。需注意到value的类型是const as_val *,意味着回调函数没有责任去销毁value,并且value仅在回调函数作用域中可见。回调函数不能将value传递到函数作用域以外。

没有更多的结果需要处理时,会以NULL做为参数value的值调用回调函数。

对于正常的扫描操作,value将是一个记录,可简单地使用as_record_fromval()转换成记录对象。若参数value是个记录,此函数返回一个记录对象;否则返回空值(NULL)。也可使用as_val_type()检查value的类型。

bool callback(const as_val *value, void *udata) {
    if (value == NULL) {
        // scan is complete
        return true;
    }

    as_record *rec = as_record_fromval(value);

    if (rec != NULL) {
        // process record
    }

    return true;
}

检查后台扫描状态

函数aerospike_scan_background()把发送扫描请求发给到数据库执行,客户端不用等待结果。客户端会被返给一个扫描id(scan id),用来检查扫描的运行状态。

扫描id能用来周期性检查扫描的状态,理想状况下,应用将根据获取到的扫描状态,智能判断轮询状态的频度。

扫描的状态信息被填充到as_scane_info实例对象中:

as_scan_info scan_info;
if (aerospike_scan_info(&as, &err, NULL, scan_id, &scan_info) != AEROSPIKE_OK) {
    fprintf(stderr, "err(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}

以上代码只是很简单地检查状态,并假设状态检查只做一次。

若应用持续跟踪运行已用时间,那在获取状态后就能通过检查scan_info的成员域progress_pct,估计出扫描还将占用多长时间,。

原谅链接: http://www.aerospike.com/docs/client/c/usage/scan/scan.html

译       者:歪脖胡子Q

时间: 2024-10-05 16:40:17

Aerospike C客户端手册———数据扫描—记录扫描的相关文章

Aerospike C客户端手册———查询—查询记录

查询记录 查询时除了使用主索引,Aerospike C客户端也提供API来通过检索次索引查询数据库. 为了使用次索引查询数据,首先应初始化并填充一个as_query对象:然后,以初始化完成的as_query对象,使用aerospike_query_foreach()执行查询.一个查询可以: 对返回的满足条件记录逐个调用回调函数. 对返回的满足条件记录集合应用流式用户定义函数(StreamUDF),再对StreamUDF返回结果调用回调用函数. 此章节专注于第一种方式,如想了解第二种方式,请参见[

Aerospike C客户端手册———数据扫描—在扫描上应用聚合

在扫描上应用聚合 C客户端提供能力来扫描指定namespace或set中的所有记录,并在结果集上应用聚合UDF(Stream UDF).此能力是通过查询接口,通过不指定谓词的查询语句来实现.请参见:[记录聚合]章节 原文链接: http://www.aerospike.com/docs/client/c/usage/scan/scan_aggregate.html 译       者:歪脖大肚子Q

Aerospike C客户端手册———用户定义函数—应用UDF到记录

应用UDF到记录 Aerospike C客户端API提供aerospike_key_apply()来应用一个用户定义函数到数据库中某记录. 在使用aerospike_key_apply()操作前,包含被应用函数的UDF模块,必须首先注册到Aerospike服务器.请参见[注册用户定义函数]章节来学习如何使用C API注册,或阅读[aql手册]学习如何使用外部工具注册. 下面的代码引用自示例目录[examples/basic_examples/get],由Aerospike C客户端安装包自带.

Aerospike C客户端手册———键-值存储—删除记录

删除记录 Aerospike C客户端API提供一个简单的操作来删除数据库中的数据. 数据删除示例代码被所有示例使用.下面的代码引用自示例目录[examples/basic_examples/put],由Aerospike C客户端安装包自带. 请先阅读[创建连接]章节内容,理解如何建立与集群的连接. 初始化键(KEY) 删除记录时,数据库需要通过键(key)来标识这条记录.下面我们为示例代码创建一个键.用来做键的是字符串"test-key",数据所在的namespace名称为&quo

Aerospike C客户端手册———键-值存储—批量读取记录

批量读取记录 除了每次读取单条记录外,还可以在一个事务中从集群中读取多条记录.相关的客户Aerospike C客户端API调用是: aerospike_batch_get() - 返回所需记录所有bin数据. aerospike_batch_exists() - 返回所需记录元数据(生存时间, 分代编号). 后面的代码引用自示例目录[examples/basic_examples/get],由Aerospike C客户端安装包自带. 请先阅读[创建连接]章节内容,理解如何建立与集群的连接. 初始

Aerospike C客户端手册———键-值存储—读取记录

读取记录 Aerospike C 客户端AP提供四个从数据库读取一条记录的操作: aerospike_key_get() - 读取一条记录所有bin数据. aerospike_key_select() - 读取一条记录指定bin数据. aerospike_key_exists() - 检查一条记录的存在性. aerospike_key_operate() - 在一条记录上执行操作,包括对指定bin的读取操作. 此章节主要讨论前三个操作,aerospike_key_operate()操作将在后面的

Aerospike C客户端手册———示例

示例 Aerospike C客户端函数库自带一系列的示例,用来说明如何使用客户端构建应用.这些示例打包在[客户端函数库安装包]中,安装到'examples'目录下. 示例包括的内容抽样说明如下: 基本示例 存放和获取包含多bin的记录. 设置记录生存时间(TTL). 在记录上应用用户定义函数. 批量示例 一次请求多条记录. 查询示例 次索引与聚合的使用 扫描示例 扫描整个namespace或一个set. 在扫描的结果集上应用用户定义函数. 为了构建所有示例,请转到examples目录下,然后执行

Aerospike C客户端手册———查询—次索引管理

次索引管理 Aerospike C客户端提供在数据库中创建和删除次索引的能力. 目前,次索引可用namespace.set.bin三者名称的组合来创建,可用于创建索引的bin数值类型是整型(integer)或字符串(string).若一个次索引被定义在包含整型数值的.名称为"x"的bin上,那么只有包含bin "x"且bin数值为整型的记录被索引.其它包含bin "x"但数据不是整型的记录不被索引. 索引管理调用被提交到Aerospike集群中的

Aerospike C客户端手册———日志

日志 Aerospike C客户端有一个日志设施,用于记录内部日志信息.默认情况下,日志记录器将日志信息写到stderr.但应用可更改日志的详细程度或提供一个客户化方法来记录日志信息. 设置日志级别 若应用需要修改日志信息详细程度,可使用as_log_set_level()设置不同的日志级别:. as_log_set_level(&as->log, AS_LOG_LEVEL_DEBUG); 日志级别有: AS_LOG_LEVEL_OFF AS_LOG_LEVEL_ERROR AS_LOG_L