如何获取Aerospike中记录的主键(PK)?

时间:2018-10-09 09:34:00

标签: java aerospike aerospike-ce

我想从航空突刺中获得特定记录。

但是当我执行以下查询时,我没有结果:

select * from ctl.prodCache where PK='111222';

但是当我执行以下查询时:

select * from ctl.prodCache;

它给了我所有记录,但根本不显示主键。

  

{             “ edigest”:“ BE6ZxLRMKwnbmUqPTvsmcIAgVv8 =”,             “ set”:“ prodCache”,             “ ttl”:54             “ gen”:1,             “垃圾箱”:{               “ C”:“ java.util.ArrayList”,               “ V”:“ 00 10 70 61 79 74 6D 6D 61 2E 64 6F 6D 61 69 6E 2E 43”             }           }

有什么建议吗?请帮忙。

3 个答案:

答案 0 :(得分:3)

默认情况下,Aerospike不会存储您的主键。它存储密钥的RIPEMD160哈希+密钥类型+集合名称的1个字节。这就是您在base64中看到的edigest输出中的内容。在AQL中,您可以将SEND_KEY设置为true,然后它将显示在有关记录的元数据中。在AQL中,将SET RECORD_PRINT_METADATA设置为true,将SET OUTPUT JSON设置为更好的可见性。现在,如果您的键是字符串“ 111222”,则使用PK ='111222'的查询应该可以工作,如果它是整数,则使用PK = 111222即可。

答案 1 :(得分:2)

这是因为默认设置是不将主键与记录一起存储。 record由元组(namespace, set, PK)标识,然后由客户端通过RIPEMD-160散列为20字节的摘要。该摘要是记录的实际标识符。客户端通过这种方式找到其分区ID,查找哪些节点拥有该分区的主节点,然后单跳转到该节点。

在该节点上,摘要是与主索引匹配以查找该记录的元数据的内容。扫描将遍历primary index到特定的名称空间,获取所有记录的元数据,并将它们流回客户端。如果您选择将写入策略的sendKey属性设置为true,则密钥将与记录的数据一起保存。然后,您可以从扫描/查询中找到它。默认情况下不会发生这种情况,因为那可能意味着很多空间

答案 2 :(得分:0)

首先从AQL执行以下命令:

SET KEY_SEND TRUE

,然后将数据插入特定的集中。

然后,执行选择查询。

仅在将KEY_SEND设置为true的情况下完成插入的PK才会显示。