java redis的单机配置和集群配置及一个错误Broken pipe及解决

目录

 

单机配置和集群配置

一个错误Broken pipe及解决

问题描述

问题分析

解决方案


单机配置和集群配置

 

package cn.enn.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.*;

import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class JedisTool implements Serializable {
    protected static final Logger logger = LoggerFactory.getLogger(JedisTool.class);
    private static String strkey="someMapKey";
    private static Map<String,JedisCluster> mapSome = new HashMap<String, JedisCluster>();
    private static Map<String,Jedis> mapone = new HashMap<String, Jedis>();
    //获取集群实例
    public static JedisCluster getSome(String hostsAndPort){
        String[] arr=hostsAndPort.split(",");
        if(mapSome.containsKey(strkey)
                && mapSome.get(strkey)!=null ){
            logger.info("redis is PONG");
        }else{
            logger.warn("redis is not PONG");
            JedisPoolConfig config = new JedisPoolConfig();
            config =new JedisPoolConfig();
            config.setMaxTotal(100);//设置最大连接数
            config.setMaxIdle(100); //设置最大空闲数
            config.setMaxWaitMillis(30000);//设置超时时间
            config.setTestOnBorrow(true);
            config.setTestWhileIdle(true);
            config.setTestOnBorrow(true);
            JedisCluster jedisCluster = new JedisCluster(getHostAndPort(arr),config);
            mapSome.put(strkey,jedisCluster);
        }
        return mapSome.get(strkey);
    }
    //获取单机实例
    public static Jedis getOne(String host){
        if(mapone.containsKey(strkey)
                && mapone.get(strkey)!=null && "pong".equalsIgnoreCase(mapone.get(strkey).ping())){
            logger.info("redis is PONG");
        }else{
            logger.warn("redis is not PONG");
            if(mapone.get(strkey)!=null){
                mapone.get(strkey).close();
            }
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(10);
            jedisPoolConfig.setMaxWaitMillis(1000);
            jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1800000);
            jedisPoolConfig.setTestWhileIdle(true);
            jedisPoolConfig.setTestOnBorrow(true);
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, 6379, 100000, null,1);
            Jedis jedis = jedisPool.getResource();
            mapone.put(strkey,jedis);
            if("pong".equalsIgnoreCase(mapone.get(strkey).ping())){
                logger.warn("redis is change to PONG");
            }

        }
        return mapone.get(strkey);
    }
    public static Set<HostAndPort> getHostAndPort(String[] hostAndPort){
        Set<HostAndPort> hap = new HashSet<HostAndPort>();
        String[] hs = null;
        for(String host:hostAndPort){
            hs=host.split(":");
            hap.add(new HostAndPort(hs[0], Integer.parseInt(hs[1])));
        }
        return hap;
    }

}

一个错误Broken pipe及解决

问题描述

20/04/02 08:54:11 ERROR executor.Executor: Exception in task 1.2 in stage 20049.0 (TID 60154)
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)

...

Caused by: java.net.SocketException: Broken pipe (Write failed)

 

问题分析


产生错误的原因应该是jedis从连接池获取连接时,拿到的连接是一个无效的(可能是一个已经过期的连接),这时候拿到连接并没有对连接做有效性验证,而是直接使用它,导致了上述问题。

解决方案


开启了redis连接池的两个配置参数

testWhileIdle   true

testOnBorrow   true

分别表示 在空闲时检查有效性、在获取连接的时候检查有效性 检查到无效连接时,会清理掉无效的连接,并重新获取新的连接。


 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值