6

この次のコードを使用して、「NAME:」で始まるすべてのキーを抽出し、5,000 を超えるレコードのみを返します (私のインデックスには 60,000 を超えるキーがあります)。なぜそれが起こっているのか、またはRedisデータベースからすべてのキーを抽出する方法を誰でも説明できますか.

jedis.select(3);

    Set<String> names=jedis.keys("NAME:*");

    Iterator<String> it = names.iterator();
    while (it.hasNext()) {
        String s = it.next();
        System.out.println(s);
    }
4

3 に答える 3

3

Redis サーバーに多くのレコードが保存されている場合、jedis.keys()コマンドを使用すると処理が過剰になる可能性があります。したがって、タスクが元に戻されると停止します。代わりに、jedis.hscan()上記の問題を回避するために使用します。

ScanParams scanParam = new ScanParams();
String cursor = "0";
int i = 0;
scanParam.match(prefix + "*");
scanParam.count(50000); // 2000 or 30000 depend on your
do {
ScanResult<Map.Entry<String, String>> hscan = jedis.hscan(key, cursor, scanParam);

// any code here
//
//

// check cursor 
cursor = hscan.getStringCursor();
} while("0".equals(cursor));

あなたの場合はうまくいきます。

于 2016-08-09T08:17:19.530 に答える
0

keys以下の JavaDoc に記載されているように、通常の Redis の使用にはこのメソッドを使用しないでください。

http://javadox.com/redis.clients/jedis/2.2.0/redis/clients/jedis/Jedis.html#keys(java.lang.String)

代わりに、このような Redis セットの使用を検討してください。

final Jedis jedis = new Jedis("localhost");
jedis.sadd("setName", "someValue");
jedis.smembers("setName");
jedis.close();
于 2016-10-14T10:39:57.427 に答える
-3

キー検索パターンで NAME なしで試してください。

        Set<String> names = jedis.keys("*");

        java.util.Iterator<String> it = names.iterator();
        while(it.hasNext()) {
            String s = it.next();
            System.out.println(s + " : " + jedis.get(s));
        }
于 2016-01-29T10:58:29.503 に答える