Redis经常会报出RedisConnectionFailureException: java.net.SocketException: Broken pipe

【背景】: 在测试和生产环境上,偶尔会出现如下的redis异常。
在APP层面的现象就是界面提示:”网络连接异常”,但下次点击APP的时候,又可以正常使用了。

11:28:29 INFO  - get data from redis, key = c15aad89-4a1a-4cb0-82a5-2027b990c1ca
11:28:29 WARN  - /market/info/eForum/getIndexList
    org.springframework.data.redis.RedisConnectionFailureException: java.net.SocketException: Broken pipe; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe
    at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:67) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:41) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:37) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:37) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:212) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.connection.jedis.JedisConnection.get(JedisConnection.java:1117) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.core.DefaultValueOperations$1.inRedis(DefaultValueOperations.java:46) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:54) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:204) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:166) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:88) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:43) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    at com.pa.market.common.util.CommonUtil.getObjectFromRedis(CommonUtil.java:635) ~[pa-market-common-1.1.jar:1.1]
    at com.pa.market.common.util.UserTokenUtil.getUserInfoExt(UserTokenUtil.java:77) ~[pa-market-common-1.1.jar:1.1]
    at com.pa.market.common.util.UserTokenUtil.getUserInfo(UserTokenUtil.java:60) ~[pa-market-common-1.1.jar:1.1]
    at com.pa.market.common.util.UserTokenUtil.getUserInfo(UserTokenUtil.java:44) ~[pa-market-common-1.1.jar:1.1]
    at com.pa.market.common.util.CountFilter.doFilter(CountFilter.java:77) ~[pa-market-common-1.1.jar:1.1]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-4.3.3.RELEASE.jar:4.3.3.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548) ~[jetty-security-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511) ~[jetty-servlet-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.Server.handle(Server.java:524) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253) ~[jetty-server-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) ~[jetty-io-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) ~[jetty-io-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) ~[jetty-io-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303) ~[jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148) ~[jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136) ~[jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671) ~[jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589) ~[jetty-util-9.3.11.v20160721.jar:9.3.11.v20160721]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe
    at redis.clients.jedis.Connection.flush(Connection.java:291) ~[jedis-2.7.3.jar:?]
    at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:214) ~[jedis-2.7.3.jar:?]
    at redis.clients.jedis.BinaryJedis.get(BinaryJedis.java:159) ~[jedis-2.7.3.jar:?]
    at org.springframework.data.redis.connection.jedis.JedisConnection.get(JedisConnection.java:1115) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    ... 46 more
Caused by: java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method) ~[?:1.8.0_91]
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) ~[?:1.8.0_91]
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[?:1.8.0_91]
    at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:31) ~[jedis-2.7.3.jar:?]
    at redis.clients.util.RedisOutputStream.flush(RedisOutputStream.java:213) ~[jedis-2.7.3.jar:?]
    at redis.clients.jedis.Connection.flush(Connection.java:288) ~[jedis-2.7.3.jar:?]
    at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:214) ~[jedis-2.7.3.jar:?]
    at redis.clients.jedis.BinaryJedis.get(BinaryJedis.java:159) ~[jedis-2.7.3.jar:?]
    at org.springframework.data.redis.connection.jedis.JedisConnection.get(JedisConnection.java:1115) ~[spring-data-redis-1.7.3.RELEASE.jar:?]
    ... 46 more
11:28:33 INFO  - get data from redis, key = c15aad89-4a1a-4cb0-82a5-2027b990c1ca

【问题原因】

Redis底层也创建了连接池,获取到了失效的连接池,并且Redis客户端尝试通过此连接池跟服务端进行通信, 导致抛出上面的异常。

【解决办法】

Redis配置的连接池使用jar包commons-pool-2.4.2.jar方式。

private boolean testOnCreate = false;
private boolean testOnBorrow = false;
private boolean testOnReturn = false;
private boolean testWhileIdle = false;

其中有如上述四个属性参数。只要配置 testOnBorrow = true 和 testWhileIdle = true 就可以。 其中 testOnBorrow = true 是获取链接的时候对链接的有效性进行检查,会影响效率,在高并发的前提下。所以一般只是配置 testWhileIdle = true , 这个是在闲暇的时候进行检查,去除无效的链接。

【思考】

如果采用spring boot自动集成的方式,如何去设置testOnBorrow 这个参数呢? 因为默认情况下,testOnBorrow 是false方式。难不成为了修改这个参数,重新去自定义一个Redis的Bean?? 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值