当我尝试使用匹配模式运行jediscluster.scan()时,为什么会出现缺少哈希标记的错误?

nuypyhwy  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(1434)

我想用绝地来扫描我的redis集群。我试着用 .scan(...) 方法,但我得到以下错误:
“jediscluster仅支持具有包含哈希标记的匹配模式的扫描命令”
我的代码如下(节选):

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;
    }
}

当我运行代码时,在谈到hashtags时会出现一个奇怪的错误:“jediscluster只支持带有包含hashtags的匹配模式的scan命令”
在redis cli中,我可以使用我为keyprefix变量编写的匹配模式。为什么我会出错?
我怎样才能让绝地武士给我看所有与给定子串匹配的钥匙?

carvr3hs

carvr3hs1#

问题是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;
          }
        }
      }
    });

相关问题