Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绝地扫描没有';我找不到钥匙_Java_Redis_Jedis - Fatal编程技术网

Java 绝地扫描没有';我找不到钥匙

Java 绝地扫描没有';我找不到钥匙,java,redis,jedis,Java,Redis,Jedis,我想通过以下代码片段使用Jedis从Redis cluster获取所有密钥: public void testRedis() { String key = "*"; ScanParams scanParams = new ScanParams().count(1000).match("{*}"); String cur = SCAN_POINTER_START; do { ScanResult<Str

我想通过以下代码片段使用Jedis从Redis cluster获取所有密钥:

 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));
    }
public void testRedis(){
字符串键=“*”;
ScanParams ScanParams=new ScanParams().count(1000).match(“{*}”);
字符串cur=扫描\指针\开始;
做{
ScanResult ScanResult=getRedisCluster().scan(cur,scanParams);
scanResult.getResult().stream().forEach(System.out::println);
cur=scanResult.getStringCursor();
}而(!cur.equals(SCAN_POINTER_START));
}
我的问题是,这个解决方案不会返回任何结果。即使我为现有密钥指定匹配模式,它仍然不起作用。 我尝试使用get命令获取特定的键,它返回的值没有任何错误,因此连接看起来很好

有什么建议吗?
(我的一个线索是match参数正在等待“花括号”,所以我不得不在那里添加,但我还没有在互联网上看到过这样的用法。)

match方法的模式应该是
“*”
而不是
“{*}”

通过从每个节点获取密钥并统一它们,可以获取集群的所有密钥

getClusterNodes()
方法会很方便,它会返回所有集群节点的映射

下面是一个使用
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);
}
public void testRedis(){
ScanParams ScanParams=新的ScanParams().计数(1000);
Set allKeys=new HashSet();
getRedisCluster().getClusterNodes().values().forEach((池)->{
字符串cur=ScanParams.SCAN\u POINTER\u START;
做{
试试看(绝地武士=pool.getResource()){
ScanResult ScanResult=jedis.scan(cur,scanParams);
allKeys.addAll(scanResult.getResult());
cur=scanResult.getStringCursor();
}
}而(!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);
}
public void testRedis(){
ScanParams ScanParams=新的ScanParams().计数(1000);
Set allKeys=new HashSet();
对于(存储池:getRedisCluster().getClusterNodes().values()){
字符串cur=ScanParams.SCAN\u POINTER\u START;
做{
试试看(绝地武士=pool.getResource()){
ScanResult ScanResult=jedis.scan(cur,scanParams);
allKeys.addAll(scanResult.getResult());
cur=scanResult.getStringCursor();
}
如果(allKeys.size()>=1000)中断;
}而(!cur.equals(ScanParams.SCAN_POINTER_START));
如果(allKeys.size()>=1000)中断;
}
allKeys.stream().forEach(System.out::println);
}

如果我这样做,我总是会收到以下错误消息:java.lang.IllegalArgumentException:JedisCluster只支持带有包含哈希标记的匹配模式的扫描命令(用花括号括起来的字符串)),这就是它抛出execption的原因:@Twi只是用一个redi而不是集群运行了这个命令,它可以工作。我用了绝地2.9.0是的,但我需要用集群。我知道它可以与一个redis一起使用,但我需要与ClusterScan一起使用。扫描解决方案看起来非常不错,但即使集合中有1000个键,它也不会停止,因为迭代器尚未完成。停下来不拿到所有钥匙的好办法是什么?