jedispool使用自动归还jedis解决方案

针对使用JedisPool时需要手动归还Jedis的问题,本文介绍了在无法依赖Spring管理实例生命周期且不使用Redisson的情况下,如何封装一层实现自动归还Jedis的代码示例。
摘要由CSDN通过智能技术生成

在使用jedispool的时候遇到一个尴尬的问题。实例必须要手动归还。即jedis高版本的jedis.close()来归还。
由于我们系统是用grpc做通信机制,所以不存在通过spring 管理实例的生命周期来控制,经研究决定也决定不采用Redisson. 那接下来只有用比较扎实的办法了。
封装一层实现归还。附上代码。。。有更强大的方法欢迎指导。
“`
/* Title: Redis操作接口
* Description:
*
* @author wenquan
* @date 2017年1月4日
*/
public class RedisUtil {
private static JedisPool pool = null;

private static String  filePath ="server.properties";


/*** <p>Description: 获取jedispool 连接池 </p>
* @author wenquan
* @date  2017年1月5日
* @param 
*/
private static JedisPool getPool() {  
    if (pool == null) {  
        JedisPoolConfig config = new JedisPoolConfig();  
        Properties prop = new Properties();
        try {
            prop.load(RedisUtil.class.getClassLoader().getResourceAsStream(filePath));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;  
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。  
        config.setMaxTotal(Integer.valueOf(prop.getProperty("redisServer.MaxTotal").trim())); 
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。  
        config.setMaxIdle(Integer.valueOf(prop.getProperty("redisServer.MaxIdle").trim()));  
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;  
        config.setMaxWaitMillis(Integer.valueOf(prop.getProperty("redisServer.MaxWaitMillis").trim()));
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;  
        config.setTestOnBorrow(true);  


        String redisIp = prop.getProperty("redisServer.ip").trim();
        Integer redisPort = Integer.valueOf(prop.getProperty("redisServer.port").trim());
    //  String redisPass = prop.getProperty("redisServer.passwd").trim();
        // timeOut = Integer.valueOf(prop.getProperty("redisServer.poolTimeout").trim());

        pool = new JedisPool(config, redisIp, redisPort);  

    }  
    return pool;  
}  

/*** <p>Description: 返回资源 </p>
* @author wenquan
* @date  2017年1月5日
* @param 
*/
public static void returnResource(JedisPool pool, Jedis jedis) {  
    if (jedis != null) {  
         jedis.close();
    }  
}  



/*** <p>Description: 获取jedis 实例</p>
* @author wenquan
* @date  2017年1月5日
* @param 
*/
public static Jedis getJedis() throws Exception {  
    Jedis jedis = null; 
    pool = getPool();  
    jedis = pool.getResource(); 
    return jedis;
}  

/*** <p>Description: 得到值</p>
* @author wenquan
* @date  2017年1月5日
* @param key
*/
public static String get(String key){  
    String value = null;  
    Jedis jedis = null;
    try {
        jedis= getJedis();
        value = jedis.get(key); 
    } catch(Exception e){
        if(jedis != null){
            jedis.close();
        }
        e.printStackTrace();
    } finally {
        returnResource(pool, jedis);  
    }
    return value;  
}  

/*** <p>Description: 设置键值</p>
* @author wenquan
* @date  2017年1月5日
* @param key value
*/
public static String set(String key,String value){
     Jedis jedis = null;
     String ans = null;
     try {  
         jedis = getJedis();  
         ans = jedis.set(key,value);  
     } catch (Exception e) {  
         //释放redis对象  
         if(jedis != null){
             jedis.close();
         }
         e.printStackTrace();  
     } finally {  
         //返还到连接池  
         returnResource(pool, jedis);  
     }  
     return ans;
}


/*** <p>Description: 设置键值 并同时设置有效期</p>
* @author wenquan
* @date  2017年1月5日
* @param key seconds秒数 value
*/
public static String setex(String key,int seconds,String value){
     Jedis jedis = null;
     String ans = null;
     try {  

         String.valueOf(100);
         jedis = getJedis();  
         ans = jedis.setex(key,seconds,value);  
     } catch (Exception e) {  
         if(jedis != null){
            jedis.close();
         }
        e.printStackTrace();  
     } finally {  
         //返还到连接池  
         returnResource(pool, jedis);  
     }  
     return ans;
}

/*** <p>Description: </p>
 * <p>通过key 和offset 从指定的位置开始将原先value替换</p>
 * <p>下标从0开始,offset表示从offset下标开始替换</p>
 * <p>如果替换的字符串长度过小则会这样</p>
 * <p>example:</p>
 * <p>value : bigsea@zto.cn</p>
 * <p>str : abc </p>
 * <P>从下标7开始替换  则结果为</p>
 * <p>RES : bigsea.abc.cn</p>
* @author wenquan
* @date  2017年1月6日
* @param 
* @return 返回替换后  value 的长度
*/
public static Long setrange(String key,String str,int offset){
     Jedis jedis = null;  

     try {  
         jedis = getJedis();  
         return jedis.setrange(key, offset, str);  
     } catch (Exception e) {  
        if(jedis != null){
            jedis.close();
        }
        e.printStackTrace();  
        return 0L;
     } finally {  
         //返还到连接池  
         returnResource(pool, jedis);  
     }
}

/*** <p>Description: 通过批量的key获取批量的value</p>
* @author wenquan
* @date  2017年1月6日
* @param 
* @return 成功返回value的集合, 失败返回null的集合 ,异常返回空
*/
public static List<String> mget(String...keys){
    Jedis jedis = null;  
    List<String> values = null;
    try {  
        jedis = getJedis();  
        values = jedis.mget(keys);  
    } catch (Exception e) {  
    if(jedis != null){
            jedis.close();
        }
        e.printStackTrace();  
    } finally {  
        //返还到连接池  
        returnResource(pool, jedis);  
    }
    return values;
}

/*** <p>Description: 批量的设置key:value,可以一个</p>
 * <p>obj.mset(new String[]{"key2","value1","key2","value2"})</p>
* @author wenquan
* @date  2017年1月6日
* @param 
* @return
*/
public static String mset(String...keysvalues){
    Jedis jedis = null;
    String ans = null;
    try{
        jedis = getJedis();
        ans = jedis.mset(keysvalues);
    }catch (Exception e) {  
        if(jedis != null){
            jedis.close();
        }
        e.printStackTrace();  
    } finally {  
        //返还到连接池  
        returnResource(pool, jedis);  
    }
    return ans;
}

/*** <p>Description: 通过key向指定的value值追加值</p>
* @author wenquan
* @date  2017年1月6日
* @param key str 追加字符串
*/
public static Long append(String key,String str){
     Jedis jedis = null;  

     try {  
         jedis = getJedis();  
         return jedis.append(key, str);  
     } catch (Exception e) {  
        if(jedis != null){
            jedis.close();
        }
        e.printStackTrace();  
        return 0L;
     } finally {  
         //返还到连接池  
         returnResource(pool, jedis);  
     }  
}

/*** <p>Description: 判断key是否存在</p>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值