Aerospike:如何获取记录密钥? [英] Aerospike: how do I get record key?
问题描述
Aerospike客户端具有 scanAll 方法,可从其存储中读取所有行.我在以下代码中使用它:
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());
}
});
但是它用 NullPointerException
完成,因为userKey为null.所有其他字段均有效.用户密钥是用于保存数据的Long值:
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));
可能有什么问题吗?为什么userKey为null?
What may be wrong? Why userKey is null?
推荐答案
Aerospike使用密钥和设置名称来生成唯一的摘要,因此它仅存储摘要.
Aerospike uses key and set name to generate unique digest, So it stores only digest.
如果您插入一条记录(如果您设置 writePolicy.sendKey = true
),则密钥将作为记录的元数据存储.如果使用 writePolicy.sendKey = true
插入一条记录,则只有您将获得scanCallback()中的密钥.
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().
默认情况下writePolicy.sendKey为false,因此默认情况下 scanCallback()
将 null 作为键.这就是为什么您的 key.userKey.toLong()
给出 NullPointerException .
By default writePolicy.sendKey is false, so by default scanCallback()
gets null as key. Thats why your key.userKey.toLong()
gives NullPointerException.
这篇关于Aerospike:如何获取记录密钥?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!