专栏首页技术探索使用Jedis在高并发报错 (java.net.SocketException: Connection reset by peer: socket write error)

使用Jedis在高并发报错 (java.net.SocketException: Connection reset by peer: socket write error)

Connection reset by peer: socket write error错误分析: 常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: ①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉; ②:客户关掉了浏览器,而服务器还在给客户端发送数据; ③:浏览器端按了Stop

1.报错信息

java.lang.reflect.InvocationTargetException: null
	at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	....
	at java.lang.Thread.run(Unknown Source)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset by peer: socket write error
	at redis.clients.jedis.Connection.flush(Connection.java:334)
	at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:257)
	at redis.clients.jedis.BinaryJedis.get(BinaryJedis.java:244)
	......
	... 15 common frames omitted
Caused by: java.net.SocketException: Connection reset by peer: socket write error
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(Unknown Source)
	at java.net.SocketOutputStream.write(Unknown Source)
	at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:52)
	at redis.clients.util.RedisOutputStream.flush(RedisOutputStream.java:216)
	at redis.clients.jedis.Connection.flush(Connection.java:331)
	... 22 common frames omitted

所以本问题是由 ①造成的

2.修改之前的代码

初始化jedis的代码

/**
  * 在多线程环境同步初始化
  */
 private static synchronized void poolInit() {
     if (pool == null) {
         createJedisPool();
     }

 }

* 获取一个jedis 对象
  *
  * @return
  */
 public static Jedis getJedis() {

     if (pool == null) {
         poolInit();
     }
 
     return pool.getResource();
    
      
 }

使用jedis的代码

private static Jedis jedis = JedisPoolUtil.getJedis();

public static Object getObject(String key) {
      if(exists(key)){
          return deserialize(jedis.get(key.getBytes()));
      }
      return null;
  }

3.修改之后的代码

初始化jedis的代码

/**
 * 获取一个jedis 对象
 *
 * @return
 */
public static Jedis getJedis() {

    if (pool == null) {
        poolInit();
    }
    //如果没有以下代码会造成初始化的jedis拿不到 jedis对象
    Jedis jedis = null;
    try {
        if (pool != null) {
            jedis = pool.getResource();
        }
    }
    catch (Exception e) {
        logger.error("获取redis失败 : {}" + ExceptionUtils.getStackTrace(e));
    }
    return jedis;
}

使用jedis的代码

/**
    * 读取对象
    *
    * @param key
    * @return
    */
   public static Object getObject(String key) {
       if (exists(key)) {
           //初始化jedis用完之后关闭连接
           Jedis jedis = JedisPoolUtil.getJedis();
           Object object = deserialize(jedis.get(key.getBytes()));
           jedis.close();
           return object;
       }
       return null;
   }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务扩展性和高可用-可扩展性、高可用性和性能

    术语可扩展性、高可用性、性能和关键任务对于不同的组织或组织内的不同部门来说可能意味着不同的事情。它们经常互换,造成混乱,导致管理不善的期望、实现延迟或不切实际的...

    日薪月亿
  • localStorage简单封装设置失效时间

    localStorage和cookie 的区别不详细对比,但是localStorage存储数据的时候有一点需要我们注意的。

    日薪月亿
  • Kafka集群搭建步骤

    日薪月亿
  • 腾讯开源万亿级分布式消息中间件 TubeMQ

    beMQ 是腾讯在 2013 年自研的分布式消息中间件系统,专注服务大数据场景下海量数据的高性能存储和传输,经过近 7 年上万亿的海量数据沉淀,目前日均接入量超...

    Java帮帮
  • 这个在线神器帮你搞定你感兴趣领域的文献综述!

    我们在刚刚开始科研工作的时候,都想要快速了解这个领域,通常我们都会找一些影响因子高的综述入手,英语水平弱一点的从中文综述入手。然后,通过关键字检索,找到几十篇文...

    百味科研芝士
  • Django 实现购物车功能

      购物车思路:使用 session 功能识别不同浏览器用户,使得用户不管是否登录了网站,均能够把想要购买的产品放在某个地方,之后随时可以显示或修改要购买的产品...

    希希里之海
  • Jmeter系列(66)- BeanShell 内置变量 vars

    BeanShell 有的内置变量,JSR223 也会有对应的变量,这里 JSR223 效率更高,所以以它为栗子

    小菠萝测试笔记
  • 机器学习改善癌症诊疗,人工智能革新医药产业

    某些癌症100% “攻克”已不再是遥不可及的梦想,人工智能将革新医药产业运作方式。 假设你点击“确定”,系统在 5 次中只有 1 次真正确定,剩下 4 次都弹...

    新智元
  • VUE是什么?

    原始的前端开发框架需要工程师写html、写css、写javascript(js)。js是脚本语言,浏览器可以运行js来执行一些js支持的动作,例如点击反馈,下拉...

    震八方紫面昆仑侠
  • 大数据技术之Sqoop

    Apache Sqoop(TM)是一种旨在有效地在Apache Hadoop和诸如关系数据库等结构化数据存储之间传输大量数据的工具。

    卡其

扫码关注云+社区

领取腾讯云代金券