Сканирование джедаев не находит ключ - PullRequest
0 голосов
/ 25 апреля 2018

Я хотел бы получить все ключи из кластера Redis, используя Jedis со следующим фрагментом кода:

 public void testRedis() {
        String key = "*";
        ScanParams scanParams = new ScanParams().count(1000).match("{*}");
        String cur = SCAN_POINTER_START;
        do {
            ScanResult<String> scanResult = getRedisCluster().scan(cur, scanParams);
            scanResult.getResult().stream().forEach(System.out::println);
            cur = scanResult.getStringCursor();
        } while (!cur.equals(SCAN_POINTER_START));
    }

Моя проблема заключается в том, что это решение не возвращает никаких результатов.Даже если я укажу соответствующий шаблон для существующего ключа, он все равно не работает.Я пытался получить определенные ключи с помощью команды get, она возвращает значение без каких-либо ошибок, поэтому соединение кажется хорошим.

Есть предложения?(Одна из моих подсказок заключается в том, что параметр соответствия ожидает «фигурные скобки», поэтому мне пришлось добавить туда, но я нигде не видел такого в Интернете.)

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете получить все ключи кластера, получив ключи от каждого узла и объединив их.

getClusterNodes() метод пригодится, который возвращает карту всех узлов кластера.

Вот реализация, использующая SCAN, аналогичная вашей попытке:

public void testRedis() {
    ScanParams scanParams = new ScanParams().count(1000);
    Set<String> allKeys = new HashSet<>();
    getRedisCluster().getClusterNodes().values().forEach((pool) -> {
        String cur = ScanParams.SCAN_POINTER_START;
        do {
            try (Jedis jedis = pool.getResource()) {
                ScanResult<String> scanResult = jedis.scan(cur, scanParams);
                allKeys.addAll(scanResult.getResult());
                cur = scanResult.getStringCursor();
            }
        } while (!cur.equals(ScanParams.SCAN_POINTER_START));
    });
    allKeys.stream().forEach(System.out::println);
}

Обновление: Вы можете проверить условия, чтобы остановить итерацию сразу после получения не менее 1000 ключей.

public void testRedis() {
    ScanParams scanParams = new ScanParams().count(1000);
    Set<String> allKeys = new HashSet<>();
    for (JedisPool pool : getRedisCluster().getClusterNodes().values()) {
        String cur = ScanParams.SCAN_POINTER_START;
        do {
            try (Jedis jedis = pool.getResource()) {
                ScanResult<String> scanResult = jedis.scan(cur, scanParams);
                allKeys.addAll(scanResult.getResult());
                cur = scanResult.getStringCursor();
            }
            if (allKeys.size() >= 1000) break;
        } while (!cur.equals(ScanParams.SCAN_POINTER_START));
        if (allKeys.size() >= 1000) break;
    }
    allKeys.stream().forEach(System.out::println);
}
0 голосов
/ 25 апреля 2018

Шаблон из метода match должен быть "*" вместо "{*}"

...