Aerospike: how do I get record key?

2019-01-26 06:22发布

Aerospike client has scanAll method for reading all rows from it's store. I use it in the folowing code:

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());
    }
});

But it is finished with NullPointerException, because userKey is null. All other fields are valid as expected. User key is the Long value, that was used for saving data:

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

All is fine, if I do single request like this:

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

What may be wrong? Why userKey is null?

2条回答
狗以群分
2楼-- · 2019-01-26 06:44

I too have faced this problem even at the time of writing we were setting the WritePolicy.sendkeys=true.

After 2-3 days debugging found that there were some issue with aerospike client version. Initially i were using 3.0.25 but after upgrading it to 3.0.35 it started working fine.

查看更多
做自己的国王
3楼-- · 2019-01-26 07:09

Aerospike uses key and set name to generate unique digest, So it stores only digest.

While inserting one record if you set writePolicy.sendKey = true then key will be stored as metadata of record. If one record is inserted with writePolicy.sendKey = true then only you will get key in scanCallback().

By default writePolicy.sendKey is false, so by default scanCallback() gets null as key. Thats why your key.userKey.toLong() gives NullPointerException.

查看更多
登录 后发表回答