keys * : 查询所有的键,当redis中key数量越大,keys 命令执行越慢,而且最重要的会阻塞服务器,对单线程的redis来说,简直是灾难,终于找到了替代命令scan。注意,如果该机器是生产环境正在对外提供服务,不建议使用keys * pattern的方法进行查询,可能会使服务器卡顿,而出现事故。一般生产服务器建议使用Scan命令,例如:SCAN 0 MATCH aaa* COUNT 5 表示从游标0开始查询aaa开头的key,每次检索5条记录,返回符合的记录。
redis中存在的key:
jedis中使用scan:
public class Test001 {
public static void main(String[] args) throws Exception {
JedisPool pool = new JedisPool("127.0.0.1",6379);
Jedis jedis = pool.getResource();
String cursor = ScanParams.SCAN_POINTER_START;//String.valueOf(0)
String key = "my*";// 匹配以 my为前缀的 key,如果是 *my*,则匹配带有 my 的key
ScanParams scanParams = new ScanParams();
scanParams.match(key);// 匹配以 my为前缀的 key
scanParams.count(5);//表示每次检索多少条记录
while (true){
//使用scan命令获取5条数据,使用cursor游标记录位置,下次循环使用
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
cursor = scanResult.getStringCursor();// 返回0 说明遍历完成
List<String> list = scanResult.getResult();
for(String str:list){
System.out.println(str);
}
System.out.println("===============");
//当cursor为0的时候,退出循环
if ("0".equals(cursor)){
break;
}
}
}
结果:
同样的,如果我们想批量删除key,在jedis中先使用scan查找出符合条件的key,然后再用jedis.del 删除。