2012-10-30 148 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)); 

它適用於您的情況。