redis中scan使用之java(api)和scala(api)

一、scala(api)

1、工具类

package com.cn.util

import redis.clients.jedis.JedisPool

object RedisUtils {

  private val host = "master"
  private val port = 6379
  //private val poolConfig = new GenericObjectPoolConfig()
  lazy val pool = new JedisPool(host, port)

  //关闭
  lazy val hooks = new Thread() {
    override def run(): Unit = {
      println("Execute hook thread: " + this)
      pool.destroy()
    }
  }
}

2、测试

package com.cn.util

import redis.clients.jedis.ScanParams

import scala.util.control.Breaks.{break, breakable}

object TestRedis {

  def main(args: Array[String]): Unit = {
    val jedis = RedisUtils.pool.getResource
    jedis.auth("123456")
    jedis.select(2)
    var scanRet = "0"
    val params = new ScanParams()
    params.`match`("*ll*")
    params.count(2)
    breakable {
      do {
        val ret = jedis.scan(scanRet, params)
        //返回下次遍历的游标
        scanRet = ret.getStringCursor
        val resultList = ret.getResult
        //      val value = resultList.iterator()
        //        while (value.hasNext){
        //          println(value.next())
        //        }
        resultList.toArray.foreach(x => println(x))
      } while (!scanRet.equals("0"))
    }
    jedis.close()
  }
}

3、输出结果

hello
ahellog
hellog
hellp

二、java(api)

1、工具类

package com.cn.until;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 *在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了
 * 这是因为高版本中官方废弃了此方法,用以下两个属性替换。
 * maxActive  ==>  maxTotal
 * maxWait==>  maxWaitMillis
 */
public class RedisUtil {
    //创建连接池对象
    private static JedisPool pool=null;
    //设定连接超时时间
    private static int POOL_TIMEOUT = 10000;
    //创建连接池
    public static JedisPool getPool(String host,int port,String pwd){
        if(pool==null ){
            JedisPoolConfig config = new JedisPoolConfig();
            //设置jedis的最大实例数
            config.setMaxTotal(10);
            //设置jedis的最大空闲实例数
            config.setMaxIdle(5);
            // 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
            config.setMaxWaitMillis(1000 * 10);
            // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
            config.setTestOnBorrow(true);

            pool=new JedisPool(config,host,port,POOL_TIMEOUT,pwd);
        }
        return pool;
    }
    
    //关闭连接池
    public static void closePool(){
        if(pool!=null){
            pool.close();
        }
    }

    //归还jedis实例到连接池
    public static void returnJedis2Pool(Jedis jedis){
        if(jedis!=null){
            jedis.close();
        }
    }
}

2、测试

package com.cn.service;

import com.cn.until.RedisUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

import java.util.List;

public class TestRedisScan {
    public static void main(String[] args) {
        String host="master";
        int port=6379;
        String pwd="123456";
        JedisPool pool = RedisUtil.getPool(host, port, pwd);
        Jedis jedis = pool.getResource();
        jedis.select(2);

        String scanRet="0";
        ScanParams scanParams = new ScanParams();
        //模糊查询
        scanParams.match("*ll*");
        //每次查询两条
        scanParams.count(2);
        do{
            ScanResult<String> ret = jedis.scan(scanRet, scanParams);
            //返回下次使用的游标
            scanRet = ret.getStringCursor();
            //返回结果集
            List<String> resultList = ret.getResult();
            for (String result:resultList) {
                System.out.println(result);
            }
        }while (!scanRet.equals("0"));
        //归还jedis实例
        RedisUtil.returnJedis2Pool(jedis);
        //关闭连接池
        RedisUtil.closePool();
    }
}

3、输出结果

hello
ahellog
hellog
hellp
发布了143 篇原创文章 · 获赞 12 · 访问量 8673

猜你喜欢

转载自blog.csdn.net/hyj_king/article/details/104633888