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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值