当前位置:   article > 正文

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

redis broken pipe

目录

 

单机配置和集群配置

一个错误Broken pipe及解决

问题描述

问题分析

解决方案


单机配置和集群配置

 

  1. package cn.enn.util;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import redis.clients.jedis.*;
  5. import java.io.Serializable;
  6. import java.util.HashMap;
  7. import java.util.HashSet;
  8. import java.util.Map;
  9. import java.util.Set;
  10. public class JedisTool implements Serializable {
  11. protected static final Logger logger = LoggerFactory.getLogger(JedisTool.class);
  12. private static String strkey="someMapKey";
  13. private static Map<String,JedisCluster> mapSome = new HashMap<String, JedisCluster>();
  14. private static Map<String,Jedis> mapone = new HashMap<String, Jedis>();
  15. //获取集群实例
  16. public static JedisCluster getSome(String hostsAndPort){
  17. String[] arr=hostsAndPort.split(",");
  18. if(mapSome.containsKey(strkey)
  19. && mapSome.get(strkey)!=null ){
  20. logger.info("redis is PONG");
  21. }else{
  22. logger.warn("redis is not PONG");
  23. JedisPoolConfig config = new JedisPoolConfig();
  24. config =new JedisPoolConfig();
  25. config.setMaxTotal(100);//设置最大连接数
  26. config.setMaxIdle(100); //设置最大空闲数
  27. config.setMaxWaitMillis(30000);//设置超时时间
  28. config.setTestOnBorrow(true);
  29. config.setTestWhileIdle(true);
  30. config.setTestOnBorrow(true);
  31. JedisCluster jedisCluster = new JedisCluster(getHostAndPort(arr),config);
  32. mapSome.put(strkey,jedisCluster);
  33. }
  34. return mapSome.get(strkey);
  35. }
  36. //获取单机实例
  37. public static Jedis getOne(String host){
  38. if(mapone.containsKey(strkey)
  39. && mapone.get(strkey)!=null && "pong".equalsIgnoreCase(mapone.get(strkey).ping())){
  40. logger.info("redis is PONG");
  41. }else{
  42. logger.warn("redis is not PONG");
  43. if(mapone.get(strkey)!=null){
  44. mapone.get(strkey).close();
  45. }
  46. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  47. jedisPoolConfig.setMaxIdle(10);
  48. jedisPoolConfig.setMaxWaitMillis(1000);
  49. jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1800000);
  50. jedisPoolConfig.setTestWhileIdle(true);
  51. jedisPoolConfig.setTestOnBorrow(true);
  52. JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, 6379, 100000, null,1);
  53. Jedis jedis = jedisPool.getResource();
  54. mapone.put(strkey,jedis);
  55. if("pong".equalsIgnoreCase(mapone.get(strkey).ping())){
  56. logger.warn("redis is change to PONG");
  57. }
  58. }
  59. return mapone.get(strkey);
  60. }
  61. public static Set<HostAndPort> getHostAndPort(String[] hostAndPort){
  62. Set<HostAndPort> hap = new HashSet<HostAndPort>();
  63. String[] hs = null;
  64. for(String host:hostAndPort){
  65. hs=host.split(":");
  66. hap.add(new HostAndPort(hs[0], Integer.parseInt(hs[1])));
  67. }
  68. return hap;
  69. }
  70. }

一个错误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

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


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/160129
推荐阅读
相关标签
  

闽ICP备14008679号