Aerospike: как я могу получить ключ от записи?

У Aerospike client есть 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. Все остальные поля действительны, как ожидалось. Ключ пользователя - это длинное значение, которое использовалось для сохранения данных:

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

Все в порядке, если я делаю один запрос следующим образом:

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

Что может быть неправильным? Почему userKey имеет значение null?

Ответ 1

Aerospike использует ключ и задает имя для генерации уникального дайджеста, поэтому он хранит только дайджест.

При вставке одной записи, если вы установили writePolicy.sendKey = true, тогда ключ будет сохранен как метаданные записи. Если одна запись вставлена ​​с помощью writePolicy.sendKey = true, тогда вы получите ключ в scanCallback().

По умолчанию writePolicy.sendKey является ложным, поэтому по умолчанию scanCallback() получает null в качестве ключа. Вот почему ваш key.userKey.toLong() дает NullPointerException.

Ответ 2

Я тоже столкнулся с этой проблемой даже во время написания, мы устанавливали WritePolicy.sendkeys = true.

После 2-3-дневной отладки выяснилось, что была проблема с версией аэрокосмического клиента. Первоначально я использовал 3.0.25, но после обновления до 3.0.35 он начал нормально работать.