我正在尝试使用 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变量是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;
}
}
}
});
我遇到了类似的问题,解决方案是更改所有键以使用主题标签,以便我可以在集群上使用“扫描”和“删除”操作。
所有按键必须设置为:
{myhash}:键名
完成此更改后,我能够进行如下扫描:
ScanParams params = new ScanParams();
String scanPattern = "{myhash}*";
params.match(scanPattern);
ScanResult<String> scanResult = cacheCluster.scan(nextCursor, params);