Я пытаюсь выполнить 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?
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.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].
!scanCursor.isFinished()
перед повторным вызовомhscan
. В противном случае вы получите сообщение об ошибке, если сканирование завершится при первом вызове. Например.scanCursor = redisCommands.hscan(key); while (!scanCursor.isFinished()) {scanCursor = redisCommands.hscan(key, scanCursor); fields.addAll(scanCursor.getMap().keySet()); }