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

时间:2014-12-01 13:22:01

标签: java aerospike nosql

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为null?

2 个答案:

答案 0 :(得分:16)

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

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

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

答案 1 :(得分:3)

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

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