标签:分布式 aerospike nosql shard-nothing 内存数据库
Aerospike C 客户端AP提供四个从数据库读取一条记录的操作:
aerospike_key_get()
— 读取一条记录所有bin数据。aerospike_key_select()
— 读取一条记录指定bin数据。aerospike_key_exists()
— 检查一条记录的存在性。aerospike_key_operate()
— 在一条记录上执行操作,包括对指定bin的读取操作。
此章节主要讨论前三个操作,aerospike_key_operate()操作将在后面的【记录高级操作】章节中讨论。
后面的代码引用自示例目录【examples/basic_examples/get】,由Aerospike C客户端安装包自带。
请先阅读【建立连接】章节内容,理解如何建立与集群的连接。
读取记录时,数据库需要通过键(key)来标识这条记录。下面我们为示例创建一个键。用来做键的是字符串”test-key",数据所在的namespace名称为“test”、set名称为“test-set”。其它数据类型也可用作键,比如:整型(integer)或二进制大对象块(blob)。
as_key key;
as_key_init_str(&key, "test", "test-set", "test-key");
使用aerospike_key_get()操作,读取一条记录所有bin数据。此操作尽可能多地以bin数据填充参数中的记录对象。记录对象(第1行)初始化为空指针(NULL)。当记录对象为空指针时,允许读取操作在堆上为记录分配足够多的bin对象空间,以容纳从数据库返回的所有bin数据。
as_record* p_rec = NULL;
if (aerospike_key_get(&as, &err, NULL, &key, &p_rec) != AEROSPIKE_OK) {
fprintf(stderr, "err(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}
as_record_destroy(rec);
当不再需要一条记录对象时,一定要通过as_record_destroy()操作释放所占用资源。
若精确地知道需从数据库中读取的bin名称,那么最好在读取时指定这些bin,而不是获取整条记录。为了指定需从服务器取回的bin,首先要创建一个以空指针(NULL)结束的字符串(string)数组,其中每个字符串是一个bin名称;然后调用aerospike_key_select()操作读取数据。
下面的代码示意用包含两个bin名称的字符串数组,从数据库中读取名称为”test-bin-1“和”test-bin-3“的bin数据。数组以空指针(NULL)结束,告诉读取操作后面不再有下一个bin名称。
as_record* p_rec = NULL;
static const char* bins_1_3[] = { "test-bin-1", "test-bin-3", NULL };
if (aerospike_key_select(&as, &err, NULL, &key, bins_1_3, &p_rec) != AEROSPIKE_OK) {
fprintf(stderr, "err(%d) %s at [%s:%d]\n", err.code, err.message, err.file, err.line);
}
as_record_destroy(rec);
当不再需要一条记录对象时,一定要通过as_record_destroy()操作释放所占用资源。
请参见最佳实践章节中【遍历记录的bin】。
经常十分简单地需要知道一个记录是否存在于数据库中。aerospike_key_exists()操作用记录的元数据填充参数中的记录对象,比如:分代(generation)编号、生存时间,可用来检查记录是否存在。
as_record* p_rec = NULL;
if (aerospike_key_exists(&as, &err, NULL, &key, &p_rec) == AEROSPIKE_ERR_RECORD_NOT_FOUND) {
fprintf(stderr, "record not found");
}
应用需要在预定时间内响应调用者的情况下,可设置读取调用时的事务超时时间,修改write_policy.timeout为相应的毫秒数。
标签:分布式 aerospike nosql shard-nothing 内存数据库
原文地址:http://blog.csdn.net/jj_tyro/article/details/45191997