在Redis中是否可以一次获取n个键?
我在Redis中有超过一百万个密钥,我想准备一个每个有10万条记录的csv文件。我想获取10万个密钥并准备文件。
答案 0 :(得分:3)
您可以将SCAN
命令与COUNT
选项一起使用。(link)
以下代码示例使用jedis作为Redis客户端。
// Assuming redis is running on port 32768 on localhost
// insert some records
Jedis jedis = new Jedis("localhost", 32768);
jedis.set("foo1", "bar1");
jedis.set("foo2", "bar2");
jedis.set("foo3", "bar3");
jedis.set("foo4", "bar4");
jedis.set("foo5", "bar5");
// first value of cursor must be "0"
String cursor = "0";
// fetch 2 keys in every scan
ScanParams scanParams = new ScanParams().count(2);
do {
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
System.out.println("Keys for cursor ---> " + cursor);
scanResult.getResult().forEach((key) -> {
System.out.println("Key = " + key);
});
cursor = scanResult.getCursor();
} while (!"0".equals(cursor));
在这里,我在每次扫描命令迭代中都获取2个密钥。 ScanResult
中返回的光标值作为输入发送到下一个扫描命令。如果没有更多结果,则光标值为“ 0”。这用于表示for循环的终止。
在运行此示例时,我看到了以下输出。
Keys for cursor ---> 0
Key == foo1
Key == foo3
Keys for cursor ---> 4
Key == foo2
Key == foo
Keys for cursor ---> 1
Key == foo5
Key == foo4
Keys for cursor ---> 5
答案 1 :(得分:1)
使用RedisTemplate
,通过使用keys
方法,您可以获取Redis中的所有密钥,如下所示:
Spring doc:RedisTemplate
Set<String> allAvailableKeys = redisTemplate.keys("*"));
Iterator<String> iterator = allAvailableKeys.iterator();
List<String> allAvailableKeyList = new ArrayList<>();
while (iterator.hasNext()) {
String key= iterator.next();
allAvailableKeyList.add(key);
}
使用Java8:
Set<String> allAvailableKeys = redisTemplate.keys("*"));
List<String> allAvailableKeyList =allAvailableKeys.stream.collect(Collectors.toList());