redis获取所有key

  1. keys:全量遍历键,用来列出所有满足特定正则字符串规则的key,假设redis此时正在生产环境下,使用该命令就会造成隐患,当redis数据量比较大时:
  • keys会一次性返回所有符合条件的key,所以会造成redis的卡顿。
  1. SCAN是一个基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。SCAN以0作为游标,开始一次新的迭代,直到命令返回游标0完成一次遍历。
    此命令并不保证每次执行都返回某个给定数量的元素,甚至会返回0个元素,但只要游标不是0,程序都不会认为SCAN命令结束,但是返回的元素数量大概率符合count参数。另外,SCAN支持模糊查询。

1.keys cmos-cache包

redisCacheService.keys(String pattern);

2.scan方法

public static Set<String> getAllKey(String match,int count){
	//返回集
	Set<String> binKeys = new HashSet<>();
	//封装scan查询参数
	ScanParams param = new ScanParams().match(match).count(count);
	//获取查询对象
	RedisCacheServiceImpl redisCacheSer = (RedisCacheServiceImpl)RedisCacheService;
	JedisCluster jedisClu = redisCacheSer.getJedisCluster();
//getClueterNodes获取集群节点,从各个集群中获取值进行遍历
	jedisClu.getClusterNodes().values().stream().forEach(pool->{
		boolean done = false;//
		String cur = "0";//游标,以0开始,返回0代表一次结束
		try(Jedis jedisNode = pool.getResource()){
			while(!done){
				ScanResult<String> scanResult = jedisNode.scan(cur,param);
				cur = scanResult.getStringCursor();
				if("0".equals(cur){done=true};
				List<String> result = scanResult.getResult();
				result.foreach(data->{binKeys.add(data)});
			}
		}
	});
	return binKeys;
}

你可能感兴趣的:(redis,java)