详谈Jedis连接池的使用
1、构建redis连接池,返还到连接池
privatestaticJedisPooljedisPool=null; privatestaticJedisjedis; static{ jedis=getJedisPool().getResource(); } /** *构建redis连接池 */ publicstaticJedisPoolgetJedisPool(){ if(jedisPool==null){ JedisPoolConfigconfig=newJedisPoolConfig(); config.setMaxTotal(1024);//可用连接实例的最大数目,如果赋值为-1,表示不限制. config.setMaxIdle(5);//控制一个Pool最多有多少个状态为idle(空闲的)jedis实例,默认值也是8 config.setMaxWaitMillis(1000*100);//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时/如果超过等待时间,则直接抛出异常 config.setTestOnBorrow(true);//在borrow一个jedis实例时,是否提前进行validate操作,如果为true,则得到的jedis实例均是可用的 jedisPool=newJedisPool(config,"127.0.0.1",6379); } returnjedisPool; } /** *释放jedis资源 */ publicstaticvoidreturnResource(Jedisjedis){ if(jedis!=null){ jedis.close(); } }
2、jedis使用
典型的jedis使用方法
publicstaticStringget(Stringkey){ Stringvalue=null; Jedisjedis=null; try{ JedisPoolpool=getJedisPool(); jedis=pool.getResource(); value=jedis.get(key); } catch(Exceptione){ returnResource(jedis); e.printStackTrace(); } finally{ returnResource(jedis); } returnvalue; }
这种写法会经常忘记返回jedis到pool.参考SptingJdbcTemplate的实现方式,优化如下
优化jedis使用方法
publicstaticStringgetByTemplate(finalStringkey){ RedisTemplateredisTemplate=newRedisTemplate(getJedisPool()); Stringvalue=redisTemplate.execute(newRedisCallback(){ @Override publicStringhandle(Jedisjedis){ returnjedis.get(key); } }); returnvalue; }
RedisTemplate封装了从JedisPool中取jedis以及返回池中
publicclassRedisTemplate{ privateJedisPooljedisPool; publicRedisTemplate(JedisPooljedisPool){ this.jedisPool=jedisPool; } publicTexecute(RedisCallback callback){ Jedisjedis=jedisPool.getResource(); try{ returncallback.handle(jedis); } catch(Exceptione){ //throwyourexception throwe; } finally{ returnResource(jedis); } } privatevoidreturnResource(Jedisjedis){ if(jedis!=null){ jedis.close(); } } } publicinterfaceRedisCallback { publicThandle(Jedisjedis); }
常用的jedis方法
字符串
@Test publicvoidtestString(){ jedis.set("name","webb");//添加数据 System.out.println("name->"+jedis.get("name")); jedis.append("name",",javaer");//拼接 System.out.println("name->"+jedis.get("name")); jedis.del("name");//删除数据 System.out.println("name->"+jedis.get("name")); jedis.mset("name","webb","age","24");//设置多个键值对 jedis.incr("age");//进行加1操作 System.out.println("name->"+jedis.get("name")+",age->"+jedis.get("age")); }
列表
@Test publicvoidtestList(){ Stringkey="javaframework"; jedis.lpush(key,"spring"); jedis.lpush(key,"springmvc"); jedis.lpush(key,"mybatis"); System.out.println(jedis.lrange(key,0,-1));//-1表示取得所有 jedis.del(key); jedis.rpush(key,"spring"); jedis.rpush(key,"springmvc"); jedis.rpush(key,"mybatis"); System.out.println(jedis.lrange(key,0,-1));//-1表示取得所有 System.out.println(jedis.llen(key));//列表长度 System.out.println(jedis.lrange(key,0,3)); jedis.lset(key,0,"redis");//修改列表中单个值 System.out.println(jedis.lindex(key,1));//获取列表指定下标的值 System.out.println(jedis.lpop(key));//列表出栈 System.out.println(jedis.lrange(key,0,-1));//-1表示取得所有 }
散列
@Test publicvoidtestMap(){ Stringkey="user"; Mapmap=newHashMap<>(); map.put("name","webb"); map.put("age","24"); map.put("city","hangzhou"); jedis.hmset(key,map);//添加数据 List rsmap=jedis.hmget(key,"name","age","city");//第一个参数存入的是redis中map对象的key,后面跟的是放入map中的对象的key System.out.println(rsmap); jedis.hdel(key,"age");//删除map中的某个键值 System.out.println(jedis.hmget(key,"age")); System.out.println(jedis.hlen(key));//返回key为user的键中存放的值的个数 System.out.println(jedis.exists(key));//是否存在key为user的记录 System.out.println(jedis.hkeys(key));//返回map对象中的所有key System.out.println(jedis.hvals(key));//返回map对象中所有的value Iterator iterator=jedis.hkeys("user").iterator(); while(iterator.hasNext()){ Stringkey2=iterator.next(); System.out.print(key2+":"+jedis.hmget("user",key2)+"\n"); } }
集合
@Test publicvoidtestSet(){ Stringkey="userSet"; Stringkey2="userSet2"; jedis.sadd(key,"webb"); jedis.sadd(key,"webb"); jedis.sadd(key,"lebo"); jedis.sadd(key,"lebo0425"); jedis.sadd(key,"who"); jedis.srem(key,"who");//删除 System.out.println(jedis.smembers(key));//获取所有加入的value System.out.println(jedis.sismember(key,"who"));//判断value是否在集合中 System.out.println(jedis.srandmember(key));//随机返回一个value System.out.println(jedis.scard(key));//返回集合的元素个数 jedis.sadd(key2,"webb"); jedis.sadd(key2,"ssq"); System.out.println(jedis.sinter(key,key2));//交集 System.out.println(jedis.sunion(key,key2));//并集 System.out.println(jedis.sdiff(key,key2));//差集 }
有序集合
@Test publicvoidtestSortedSet(){ Stringkey="sortedSet"; jedis.zadd(key,1999,"one"); jedis.zadd(key,1994,"two"); jedis.zadd(key,1998,"three"); jedis.zadd(key,2000,"four"); jedis.zadd(key,2017,"five"); SetsetValues=jedis.zrange(key,0,-1);//score从小到大 System.out.println(setValues); Set setValues2=jedis.zrevrange(key,0,-1);//score从大到小 System.out.println(setValues2); System.out.println(jedis.zcard(key));//元素个数 System.out.println(jedis.zscore(key,"three"));//元素下标 System.out.println(jedis.zrange(key,0,-1));//集合子集 System.out.println(jedis.zrem(key,"five"));//删除元素 System.out.println(jedis.zcount(key,1000,2000));//score在1000-2000内的元素个数 }
以上这篇详谈Jedis连接池的使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。