Jedis 扫描未找到任何密钥
Jedis scan doesn't find any key
我想通过以下代码片段使用 Jedis 从 Redis 集群获取所有密钥:
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));
}
我的问题是这个解决方案 return 没有任何结果。即使我为现有密钥指定匹配模式,它仍然无法正常工作。
我尝试使用 get 命令获取特定键 returns 值,没有任何错误,所以连接似乎很好。
有什么建议吗?
(我的线索之一是匹配参数等待 "curly-brackets" 所以我不得不添加到那里,但我还没有在互联网上的任何地方看到这样使用它。)
match
方法的模式应该是 "*"
而不是 "{*}"
从各个节点获取key,统一起来,即可获取一个集群的所有key。
getClusterNodes()
方法会派上用场,其中returns所有集群节点的映射。
这是一个使用 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);
}
我想通过以下代码片段使用 Jedis 从 Redis 集群获取所有密钥:
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));
}
我的问题是这个解决方案 return 没有任何结果。即使我为现有密钥指定匹配模式,它仍然无法正常工作。 我尝试使用 get 命令获取特定键 returns 值,没有任何错误,所以连接似乎很好。
有什么建议吗? (我的线索之一是匹配参数等待 "curly-brackets" 所以我不得不添加到那里,但我还没有在互联网上的任何地方看到这样使用它。)
match
方法的模式应该是 "*"
而不是 "{*}"
从各个节点获取key,统一起来,即可获取一个集群的所有key。
getClusterNodes()
方法会派上用场,其中returns所有集群节点的映射。
这是一个使用 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);
}