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