Redis_java中使用Jedis

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30604989/article/details/81505659

一、Redis在java中使用——Jedis常用操作

1、依赖

 <!--使用Redis-->
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.6</version>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>

2、测试连通性

public class RedisTest {
    @Test
    public void redisTest(){
        //连接本地Redis服务
        Jedis jedis = new Jedis("localhost",6379);
        //查看服务是否运行,打出pong表示OK
        System.out.println(jedis.ping());
    }
}

出现pong表示连通成功。

3、五大数据类型

 @Test
    public void redisTest2(){
        //连接本地服务
        Jedis jedis = new Jedis("localhost",6379);
        //获取所有key
        Set<String > keys = jedis.keys("*");

        for (Iterator iterator = keys.iterator();iterator.hasNext();) {
            String key = (String) iterator.next();
            System.out.println(key);
        }
        System.out.println(keys.contains("k2")+" "+jedis.ttl("k2")+" "+jedis.get("k2"));
        //String
        jedis.set("m1","v1");
        System.out.println(jedis.get("m1"));
        jedis.mset("str1","v1","str2","v2","str3","v3");
        System.out.println(jedis.mget("str1","str2","str3"));
        //List
        jedis.lpush("myList","v1","v2","v3","v4","v5");
        List<String> list = jedis.lrange("myList",0,-1);
        for (String element:list) {
            System.out.println(element);
        }
        //Set
        jedis.sadd("orders","jd001");
        jedis.sadd("orders","jd002");
        jedis.sadd("orders","jd003");
        Set<String> set = jedis.smembers("orders");
        for (Iterator iterator = set.iterator();iterator.hasNext();){
            String string = (String) iterator.next();
            System.out.println(string);
        }
        //Hash
        jedis.hset("hash","username","lisi");
        System.out.println(jedis.hget("hash","username"));
        Map<String,String> map = new HashMap<String,String>();
        map.put("telphone","13811814763");
        map.put("address","atguigu");
        map.put("email","[email protected]");

        jedis.hmset("hash2",map);
        List<String> result = jedis.hmget("hash2","telephone","email");
        for (String str : result) {
            System.out.println(str);
        }

        //Zset
        jedis.zadd("zset1",10,"v1");
        jedis.zadd("zset1",20,"v2");
        jedis.zadd("zset1",30,"v3");
        Set<String> s1 = jedis.zrange("zset1",0,-1);
        for (Iterator iterator = s1.iterator();iterator.hasNext();){
            String str = (String) iterator.next();
            System.out.println(str);
        }
    }

4、事务提交

加锁:

 /**
     * 通俗点讲,watch命令就是标记一个键,如果标记了一个键,在提交事务前如果该键被别人修改过,
     * 那事务就会失败,这种情况可以在程序中重新再尝试一次
     *
     * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减;足够的话就启动事务进行更新操作
     *
     * 如果在此期间键balance被其他人修改,那在提交事务(执行exec)时就会报错,
     * 程序通常可以捕获这类错误再重新执行一次,直到成功
     *
     */
    @Test
    public void ClassTest(){
        Jedis jedis = new Jedis("127.0.0.1",6379);
        int balance;//可用余额
        int debt;//欠额
        int amtToSubtract = 10;//实刷额度
        jedis.watch("balance");

        jedis.set("balance", "5");//模拟其他程序修改了该条目
        balance = Integer.parseInt(jedis.get("balance"));
        if (balance<amtToSubtract){
            jedis.unwatch();
            System.out.println("modify");
            //return false;
        }else {
            System.out.println("*************transaction");
            Transaction transaction = jedis.multi();
            transaction.decrBy("balance", amtToSubtract);
            transaction.incrBy("debt",amtToSubtract );
            transaction.exec();
            balance = Integer.parseInt(jedis.get("balance"));
            debt = Integer.parseInt(jedis.get("debt"));
            System.out.println("*********"+balance);
            System.out.println("*********"+debt);
            //return true;
        }
    }
}

5、主从复制

其中,6379,6380启动,先各自独立,主写,从读

 public void CopyTest(){
        Jedis jedis_M = new Jedis("127.0.0.1",6379);
        Jedis jedis_S = new Jedis("127.0.0.1",6380);

        jedis_S.slaveof("127.0.0.1",6379 );

        jedis_M.set("k6", "v6");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(jedis_S.get("k6"));
    }

二、JedisPool

获取Jedis实例需要从JedisPool中获取,用完Jedis实例需要返回给JedisPool。如果Jedis在使用过程中出错,则也需要还给JedisPool。

实例

扫描二维码关注公众号,回复: 3453130 查看本文章

连接池工具类

//单例模式
public class JedisPoolUtil {
    private static volatile JedisPool jedisPool = null;

    private JedisPoolUtil(){ }
    public static JedisPool getJedisPoolInstance(){
        if (jedisPool == null){
            synchronized (JedisPoolUtil.class){
                if (null == jedisPool){
                    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                    jedisPoolConfig.setMaxTotal(1000);
                    jedisPoolConfig.setMaxIdle(32);
                    jedisPoolConfig.setMaxWaitMillis(100*1000);
                    jedisPoolConfig.setTestOnBorrow(true);

                    jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
                }
            }
        }
        return jedisPool;
    }
    public static void release(JedisPool jedisPool , Jedis jedis){
        //释放
        if (null == jedis){
            jedisPool.returnResource(jedis);
        }
    }
}
 @Test
    public void redisTest4(){
        JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.set("aa", "bb");
            System.out.println( jedis.get("aa"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JedisPoolUtil.release(jedisPool,jedis );
        }
    }

关于连接池的配置说明:

 
JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
 
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
 WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
 WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
 WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;
 
testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());
 
testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
 
timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;
 
numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;
 
minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
 
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;
 
lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;
 
==================================================================================================================
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
 

猜你喜欢

转载自blog.csdn.net/qq_30604989/article/details/81505659