详谈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(RedisCallbackcallback){
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);//添加数据
Listrsmap=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
Iteratoriterator=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);
SetsetValues2=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连接池的使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。