java中单片redis到底应该怎么用,实践出真理

来源:互联网 发布:数据挖掘兴起于哪一年 编辑:程序博客网 时间:2024/06/05 10:21
import org.apache.log4j.Logger;import com.yjhl.framework.base.PropertyUtil;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** *  * 类名: RedisPool <br/> * 方法: redis连接池. <br/> * 详细描述: 描述. <br/> * 创建时间: 2016年11月15日 上午11:52:24 <br/> * * @author cyj * @version * @since JDK 1.8 */public final class RedisPool {private static Logger logger = Logger.getLogger(RedisPool.class);private static JedisPool jedisPool = null;/** *  */private static final String REDIS_CONFIG_RESOURCE = "config/redis-config.properties";private static final String PORT = "PORT";private static final String ADDR = "ADDR";private static final String AUTHPASSWORD = "AUTHPASSWORD";private static final String TIMEOUT = "TIMEOUT";/** * 初始化Redis连接池 */static {try {int port = Integer.parseInt(PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, PORT));String addr = PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, ADDR);String auth_password = PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, AUTHPASSWORD);int timeout = Integer.parseInt(PropertyUtil.getPropertyValue(REDIS_CONFIG_RESOURCE, TIMEOUT));// 池基本配置JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(200);config.setMaxIdle(50);config.setMinIdle(8);// 设置最小空闲数config.setMaxWaitMillis(1000 * 100);config.setTestOnBorrow(true);config.setTestOnReturn(true);// Idle时进行连接扫描config.setTestWhileIdle(true);// 表示idle object evitor两次扫描之间要sleep的毫秒数config.setTimeBetweenEvictionRunsMillis(30000);// 表示idle object evitor每次扫描的最多的对象数config.setNumTestsPerEvictionRun(10);// 表示一个对象至少停留在idle状态的最短时间,然后才能被idle object// evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义config.setMinEvictableIdleTimeMillis(60000);jedisPool = new JedisPool(config, addr, port, timeout, auth_password);} catch (Exception e) {logger.error(e);}}/** * 获取Jedis实例 *  * @return */public static Jedis getJedis() {Jedis resource = null;try {if (jedisPool != null) {resource = jedisPool.getResource();return resource;} else {return null;}} catch (Exception e) {if(resource != null){returnResource(resource);resource = jedisPool.getResource();}logger.error(e);}return resource;}/** * 释放redis资源</br> *  * @param jedis */public static void returnResource(Jedis jedis) {try {jedisPool.close();} catch (Exception e) {logger.error(e);}}}


关于其中的各个参数我就不一一详述了

想要深入了解redis配置参数的点击进入→http://www.cnblogs.com/qq78292959/archive/2013/09/21/3331032.html

关于优化问题任重而道远。

上述是根据jedis获取redis资源池,实现了断线重连机制

jedis的returnResource方法已经过期,由close()方法代替,查看源码你会发现里面其实是释放掉了资源而不是关闭。

经常会报的一个错误获取不到资源池的看过来:

思路:你请求资源成功后然后释放资源,关于释放资源的时机此时容易出现纰漏......


正确操作应该是这样的:请求资源放在逻辑层的try catch内,如果放在访问资源池try catch的话会导致有时候请求并未完成就释放掉了资源,于是报了上述错误。

public String getStr(String key){ Jedis jedis = RedisPool.getJedis();    String str = null;try {if(jedis == null || !jedis.exists(key)){       return null;   }   str = jedis.get(key);} catch (Exception e) {jedis.close();e.printStackTrace();}finally{jedis.close();}     return str; }



0 0