问题
- 查看redis连接数,在无处理的情况一值处于高位,shell 命令
while true
do
echo "连接数"`netstat -tun | grep 6379 | grep ESTABLISHED | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c`
sleep 1s
done
原因:
- 未将使用后的Jedis放回 资源池,或者为进行关闭,会造成如下错误:
ERR max number of clients reached
java.net.SocketException: 断开的管道 (Write failed) [一开始错误以为是linux服务器性能问题,当然可能回应影响,但不是这个原因造成]
解决
- 经查询发现,jedis在3.0版本前后,释放资源的方式不一样,如果用错误的方式去关闭资源,是无法将资源关闭或释放
如:使用jedis 2.8.0 调用 jedis.close(),无法使用资源,而是需要使用jedis.returnBrokenResource()
官方解释:
Jedis jedis = null;
jedis = redisPool.getResource();
// 此处业务处理
if (jedis != null)
{
redisPool.returnBrokenResource(redis);
jedis = null;
}
if (jedis != null) {
jedis.close();
jedis = null;
}
修改
- 3.0.0 之前的版本(本次使用 jedis 2.8.0)
Jedis jedis ;
#集群情况下使用哨兵集群
JedisSentinelPool jedisSentinelPool = null;
#单机使用JedisPool
JedisPool jedisPool = null;
#判断是否是集群
if("true".equals(es_redis_isCluster)){
jedisSentinelPool = RedisUtil.getJediSentinelPool(redis_isCluster,redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
jedis = jedisSentinelPool.getResource();
jedis.select(Integer.parseInt(redis_database));
}else{
jedisPool = RedisUtil.getJedisPool(redis_isCluster,redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
jedis = jedisPool.getResource();
jedis.select(Integer.parseInt(redis_database));
}
#释放资源:
if("true".equals(es_redis_isCluster ) && null != jedisSentinelPool){
jedisSentinelPool.returnBrokenResource(jedis);
}else{
if(null != jedisPool){
jedisPool.returnBrokenResource(jedis);
}
}
Jedis jedis ;
#集群情况下使用哨兵集群
JedisSentinelPool jedisSentinelPool = null;
#单机使用JedisPool
JedisPool jedisPool = null;
#判断是否是集群
if("true".equals(es_redis_isCluster)){
jedisSentinelPool = RedisUtil.getJediSentinelPool(redis_isCluster,redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
jedis = jedisSentinelPool.getResource();
jedis.select(Integer.parseInt(redis_database));
}else{
jedisPool = RedisUtil.getJedisPool(redis_cluster_name,redis_hostName, redis_port, redis_passWord,redis_database);
jedis = jedisPool.getResource();
jedis.select(Integer.parseInt(redis_database));
}
if("true".equals(es_redis_isCluster ) && null != jedisSentinelPool){
jedisSentinelPool.returnBrokenResource(jedis);
}else{
if(null != jedisPool){
jedis.close();
}
}