从Redis中提取密钥

时间:2012-10-30 08:59:17

标签: java redis jedis

我使用以下代码来提取所有以" 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);
    }

3 个答案:

答案 0 :(得分:2)

当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));

它适用于您的情况。

答案 1 :(得分:0)

您不应该使用keys方法进行正常的Redis使用,如下面的JavaDoc中所述。

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();

答案 2 :(得分:-2)

在按键搜索模式中尝试不使用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));
        }