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

问题描述 投票:0回答:2

我正在尝试使用 Jedis 在我的 Redis 集群上运行扫描。我尝试使用

.scan(...)
方法来匹配模式,但出现以下错误:

“JedisCluster 仅支持具有包含哈希标签的 MATCH 模式的 SCAN 命令”

我的代码如下(摘录):

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 仅支持具有包含哈希标签的 MATCH 模式的 SCAN 命令”

在 redis-cli 中,我可以使用匹配模式,就像我为 keyPrefix 变量编写的那样。为什么我会收到错误消息?

如何让 Jedis 显示与给定子字符串匹配的所有键?

redis jedis
2个回答
0
投票

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

0
投票

我遇到了类似的问题,解决方案是更改所有键以使用主题标签,以便我可以在集群上使用“扫描”和“删除”操作。

所有按键必须设置为:

{myhash}:键名

完成此更改后,我能够进行如下扫描:

ScanParams params = new ScanParams();
String scanPattern = "{myhash}*";
params.match(scanPattern);
ScanResult<String> scanResult = cacheCluster.scan(nextCursor, params);
© www.soinside.com 2019 - 2024. All rights reserved.