在使用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>