2012-10-30 230 views
4

我使用以下代码提取所有以“NAME:”开头的密钥,并且它只返回超过5,000条记录(我的索引中有超过60,000个密钥)。任何人都可以解释它为什么会发生,或者我如何从Redis数据库中提取所有密钥。从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); 
    } 
+0

你确定所有的钥匙都以“NAME:”开头吗?我认为keys命令是区分大小写的,所以如果你有“name:”或“Name:”它将不匹配。 – xetorthio

+0

感谢您的回复。是的,我确定我所有的钥匙都以“NAME:”开头。另外我手动提取Keys以“NAME:”开头,并且有超过60,000个结果。 – BonBoon

+0

这听起来很奇怪,是你选择的数据库中的所有键?你使用jedis String api或byte []来写密钥吗?我在几个场景中使用了keys命令,从来没有任何问题 –

回答

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

它适用于您的情况。