Я пытаюсь выполнить HSCAN с помощью синхронных команд салата. Проблема в том, что я не могу понять, как правильно инициализировать MapScanCursor. Я не добился успеха с конструктором, а MapScanCursor.INITIAL дает тип ScanCursor (не повезло и с приведением его к MapScanCursor).

Вот пример:

RedisClient redisClient = RedisClient.create("redis://" + url + ":" + port);
RedisHashCommands<String, String> redisCommands = redisClient.connect().sync();
List<String> fields = new LinkedList<>();

MapScanCursor<String, String> scanCursor = ?

do {
    scanCursor = redisCommands.hscan(key, scanCursor);
    fields.addAll(scanCursor.getMap().keySet());
} while (!scanCursor.isFinished());

Как мне инициализировать scanCursor?

0
tcfritchman 16 Июн 2017 в 01:34

1 ответ

Лучший ответ

У вас есть два варианта:

Чтобы ответить на ваш вопрос, инициализируйте scanCursor только с помощью hscan(key).

MapScanCursor<String, String> scanCursor = null;

do {
    if (scanCursor == null) {
        scanCursor = redisCommands.hscan(key);
    } else {
        scanCursor = redisCommands.hscan(key, scanCursor);
    }
    fields.addAll(scanCursor.getMap().keySet());
} while (!scanCursor.isFinished());

В качестве альтернативы вы можете использовать ScanIterator (см. Lettuce 4.4), который является Iterator и покрывает сложность использования Redis SCAN:

ScanIterator<KeyValue<String, String>> iterator = ScanIterator.hscan(redisCommands, key);

while (iterator.hasNext()) {

    KeyValue<String, String> next = iterator.next();
    // …
} 

Обновить

Обновлен подход на основе do…while в соответствии с комментарием tcfritchman.

1
mp911de 19 Июн 2017 в 20:54
Спасибо за полезный ответ с отличной альтернативой. Это устранило мою проблему. Одна небольшая проблема заключается в том, что при использовании первого варианта вы должны проверить !scanCursor.isFinished() перед повторным вызовом hscan. В противном случае вы получите сообщение об ошибке, если сканирование завершится при первом вызове. Например. scanCursor = redisCommands.hscan(key); while (!scanCursor.isFinished()) {scanCursor = redisCommands.hscan(key, scanCursor); fields.addAll(scanCursor.getMap().keySet()); }
 – 
tcfritchman
19 Июн 2017 в 20:39