redis的迭代器让用户可以分批获取数据库中的数据,而不是一次性获取整个数据库的全部数据,在数据量巨大的时候不会造成服务器阻塞。
package com.foxbill.redisinaction;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.ScanParams;
import redis.clients.jedis.resps.ScanResult;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @Description 数据库迭代器
*/
public class Chapter12 {
static public void start(Jedis jedis) {
prepareTestData(jedis);
scan(jedis);
hashScan(jedis);
cleanTestData(jedis);
}
/**
* 准备测试数据
*/
private static void prepareTestData(Jedis jedis) {
cleanTestData(jedis);
// 添加测试数据
for(int i=1;i<=10;i++) {
String key = "chapter12:user:"+i;
jedis.set(key, "user1"+i);
//
key = "chapter12:hash:"+i;
for (int j=1;j<=5;j++) {
jedis.hset(key, "field"+j, "value"+j);
}
}
}
private static void cleanTestData(Jedis jedis){
// 清除可能存在的测试键,确保测试结果准确
for(int i=1;i<=10;i++) {
String key = "chapter12:user:"+i;
jedis.del(key);
key = "chapter12:hash:"+i;
jedis.del(key);
}
}
//scan迭代
private static void scan(Jedis jedis) {
// 创建ScanParams对象,设置匹配模式,匹配以"chapter12:user:"开头的键,每次迭代返回约6个键,注意:这是一个提示值,不是精确值
ScanParams scanParams = new ScanParams().count(6).match("chapter12:user:*");
Set<String> matchedKeys = new HashSet<>();
String cursor = "0";
int iterationCount = 0;
do {
// 执行带模式的SCAN命令
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
List<String> keys = scanResult.getResult();
matchedKeys.addAll(keys);
cursor = scanResult.getCursor();
iterationCount++;
String result = String.join(", ", keys);
System.out.println("- 匹配模式'chapter12:user:*',第" + iterationCount + "次迭代,获取到" + keys.size() + "个键:"+ result);
} while (!cursor.equals("0"));
}
//hash数据迭代
private static void hashScan(Jedis jedis) {
System.out.println("\n【HSCAN操作 - 迭代哈希字段】");
String hashKey = "chapter12:hash:1";
Set<String> allFields = new HashSet<>();
String cursor = "0";
int iterationCount = 0;
do {
// 执行HSCAN命令,迭代哈希字段
ScanResult<Map.Entry<String, String>> scanResult = jedis.hscan(hashKey, cursor);
// 获取本次扫描的字段-值对
List<Map.Entry<String, String>> fields = scanResult.getResult();
for (Map.Entry<String, String> field : fields) {
allFields.add(field.getKey());
System.out.println(" 字段: " + field.getKey() + ", 值: " + field.getValue());
}
cursor = scanResult.getCursor();
iterationCount++;
} while (!cursor.equals("0"));
System.out.println("- HSCAN完成,共找到" + allFields.size() + "个字段");
}
}
1830

被折叠的 条评论
为什么被折叠?



