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的数量。集群的需要手动加和
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑