Aerospike:我如何获得记录密钥?

Aerospike客户端具有scanAll方法,用于从其商店中读取所有行。 我在下面的代码中使用它:

ScanPolicy policy = new ScanPolicy(); policy.concurrentNodes = true; policy.priority = Priority.DEFAULT; policy.includeBinData = true; policy.scanPercent = 100; client.scanAll(policy, "namespaceName", "setName", new ScanCallback() { @Override public void scanCallback(Key key, Record record) throws AerospikeException { STORE.put(key.userKey.toLong(), record.getValue("binName").toString()); } }); 

但它完成了NullPointerException ,因为userKey为null。 所有其他字段均按预期有效。 用户密钥是Long值,用于保存数据:

 client.put(writePolicy, new Key("namespaceName", "setName", userKey), new Bin("binName", value)); 

一切都很好,如果我做这样的单一请求:

 client.get(readPolicy, new Key("namespaceName", "setName", userKey)); 

可能有什么不对? 为什么userKey为空?

Aerospike使用密钥和集合名称来生成唯一摘要,因此它仅存储摘要。

如果设置writePolicy.sendKey = true则插入一条记录时,密钥将存储为记录的元数据。 如果使用writePolicy.sendKey = true插入一条记录,那么只有您将获得scanCallback()中的密钥。

默认情况下,writePolicy.sendKey为false,因此默认情况下scanCallback() null作为键。 这就是你的key.userKey.toLong()给出NullPointerException的原因

即使在撰写本文时我也设置了WritePolicy.sendkeys = true,我也遇到了这个问题。

经过2-3天的调试,发现airospike客户端版本存在一些问题。 最初我使用的是3.0.25,但在将其升级到3.0.35后,它开始正常工作。

Interesting Posts