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 回答