Почему при попытке запустить JedisCluster.scan () с использованием шаблона совпадения появляется ошибка об отсутствующих тегах ha sh? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь запустить сканирование моего кластера redis с помощью Jedis. Я попытался использовать метод .scan(...) следующим образом для шаблона совпадения, но получаю следующую ошибку:

"JedisCluster поддерживает только команды SCAN с шаблонами MATCH, содержащими ha sh -tags"

мой код выглядит следующим образом (отрывок):

private final JedisCluster redis;
...
String keyPrefix = "helloWorld:*";
ScanParams params = new ScanParams()
        .match(keyPrefix)
        .count(100);
String cur = SCAN_POINTER_START;

boolean done = false;
while (!done) {
    ScanResult<String> resp = redis.scan(cur, params);
    ...
    cur = resp.getStringCursor();
    if (resp.getStringCursor().equals(SCAN_POINTER_START)) {
      done = true;
    }
}

Когда я запускаю свой код, он выдает странную ошибку, говоря о хэштегах: «JedisCluster поддерживает только команды SCAN с шаблонами MATCH, содержащими ha sh -tags»

В redis-cli я мог просто использовать шаблоны соответствия, подобные тому, что я написал для переменной keyPrefix. Почему я получаю сообщение об ошибке?

Как мне заставить Jedis показать мне все ключи, соответствующие заданной подстроке?

1 Ответ

0 голосов
/ 07 марта 2020

Проблема заключалась в том, что переменная redis является объектом RedisCluster, а не объектом Redis.

Кластерный объект redis имеет коллекцию узлов и сканирование, которое отличается от сканирования отдельного узла.

Чтобы решить эту проблему, вы можете сканировать каждый отдельный узел следующим образом:

    String keyPrefix = "helloWorld:*";

    ScanParams params = new ScanParams()
        .match(keyPrefix)
        .count(100);

    redis.getClusterNodes().values().stream().forEach(pool -> {
      boolean done = false;
      String cur = SCAN_POINTER_START;
      try (Jedis jedisNode = pool.getResource()) {
        while (!done) {
          ScanResult<String> resp = jedisNode.scan(cur, params);
          ...
          cur = resp.getStringCursor();
          if (cur.equals(SCAN_POINTER_START)) {
            done = true;
          }
        }
      }
    });
...