redis的前缀匹配查找值

线上是集群模式,在不确定返回数量的情况下不太敢用keys,所以用scan,但scan用起来有些麻烦。

首先,集群模式在jedis下,是配一个ip还是所有ip都得配上。答案是配一个ip就可以了,就能访问整个集群了。

粘一下,集群使用scan的方法,寻找是否有指定前缀的key, 他依赖这个类

String key="somekey:*";
RedisService rs=new RedisService();
rs.hosts="ip:port"; //这里是集群模式,也只需要集群中的一个ip
rs.cluster=true;
rs.init();
Set<String> keys = new ConcurrentSkipListSet<>();


ScanParams sp=new ScanParams();
//sp.match(key).count(100);//463 sec
//sp.match(key).count(10);//4744 sec
sp.match(key).count(10000); //7 sec
Calendar start=Calendar.getInstance();
System.out.println("size:"+((JedisCluster)rs.jedisCommands).getClusterNodes().values().size());

for(Map.Entry<String,JedisPool> entry:((JedisCluster)rs.jedisCommands).getClusterNodes().entrySet()) {
	new Thread() {
		public void run() {
			int n=0;
			 String cur = ScanParams.SCAN_POINTER_START;
	            do {
	                try (Jedis jedis = entry.getValue().getResource()) {
	                	ScanResult<String> scanResult=null;
	                	try {
	                		scanResult = jedis.scan(cur, sp);
	                	}catch(JedisConnectionException e) {
	                		e.printStackTrace();
	                		try {
								Thread.sleep(3000);
							} catch (InterruptedException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
	                		scanResult = jedis.scan(cur, sp);
	                	}
	                    keys.addAll(scanResult.getResult());
	                    cur = scanResult.getStringCursor();
	                    if(n++%100==0) {
	                    	System.out.println("cur:"+cur+" keySize:"+keys.size()+" node "+entry.getKey()+" time:"+(Calendar.getInstance().getTimeInMillis()-start.getTimeInMillis())/1000+" sec");
	                    }
	                }
	                if(keys.size()>0) {
	                	System.out.println("find :"+keys.toArray()[0]);
	                	break;
	                }
	            } while (!cur.equals(ScanParams.SCAN_POINTER_START));
	            System.out.println("node "+entry.getKey()+" over!");
		}
	}.start();
   
};
		
	
System.out.println(keys);

上面的注释的时间是试验结果,结果证明count值越大,找少量数据越快。


另外记录一个知识点,怎么查redis集群key的数量

命令行dbsize或者info keyspace,注意返回结果是当前节点的key的数量。集群的需要手动加和

文/程忠 浏览次数:0次   2021-08-13 13:06:53

相关阅读


评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑