2016/08/29 20:03

引用来自“gzgz8080”的评论

github上已经有人发现这个问题,并且都fix了
https://github.com/xetorthio/jedis/issues/186

引用来自“乒乓狂魔”的评论

是的,但是还有更多地方值得我们深思

1 jedis为什么要暴漏这么个危险的API给用户使用(即要求用户自觉的close,不自觉后果自负),
而这种增加用户操作复杂度的API是可以避免的,所以在我们开发相关框架给别人使用的时候,尽量避免出现这种情况。

2 可以再想想出现这种问题的根本原因是什么,即同步通信中的请求响应不匹配的问题,
这种应该是很容易出现的,给我们的启示就是:在一开始设计的时候就要去考虑这一点,从而就可以避免造出这么一个大坑

引用来自“gzgz8080”的评论

其实我之前也想过,为什么jedis不像jdbc的auto-commit那样,调用一次后,自动将连接归还给连接池。
后来在业务上,经常遇到一处业务逻辑里多次调用redis。
比如
Jedis jedis = pool.getResource();
jedis.get(...);
jedis.set(...);
jedis.zrange(...);
...
jedis.close();

如果jedis做得像jdbc那样的话,
每调用一次后都自动归还,下次调用时又再次申请连接的话,
系统开销比较大,而且代码也变得繁复。
这里不是说每调用一次都自动归还,你既然都意识到这个问题了,那就肯定要优化下,比如放到ThreadLocal中。JdbcTemplate目前的实现是:如果开启了事务,则会用ThreadLocal进行暂存,如果没有开启事务,就是每次执行一次sql就释放连接到DataSource,可以详细研究下JdbcTemplate对连接的管理,这一块目前我也还有点疑问,一起讨论
2016/08/29 18:19

引用来自“gzgz8080”的评论

github上已经有人发现这个问题,并且都fix了
https://github.com/xetorthio/jedis/issues/186

引用来自“乒乓狂魔”的评论

是的,但是还有更多地方值得我们深思

1 jedis为什么要暴漏这么个危险的API给用户使用(即要求用户自觉的close,不自觉后果自负),
而这种增加用户操作复杂度的API是可以避免的,所以在我们开发相关框架给别人使用的时候,尽量避免出现这种情况。

2 可以再想想出现这种问题的根本原因是什么,即同步通信中的请求响应不匹配的问题,
这种应该是很容易出现的,给我们的启示就是:在一开始设计的时候就要去考虑这一点,从而就可以避免造出这么一个大坑
其实我之前也想过,为什么jedis不像jdbc的auto-commit那样,调用一次后,自动将连接归还给连接池。
后来在业务上,经常遇到一处业务逻辑里多次调用redis。
比如
Jedis jedis = pool.getResource();
jedis.get(...);
jedis.set(...);
jedis.zrange(...);
...
jedis.close();

如果jedis做得像jdbc那样的话,
每调用一次后都自动归还,下次调用时又再次申请连接的话,
系统开销比较大,而且代码也变得繁复。
2016/08/29 09:25
1
2016/08/26 14:27

引用来自“gzgz8080”的评论

github上已经有人发现这个问题,并且都fix了
https://github.com/xetorthio/jedis/issues/186

引用来自“乒乓狂魔”的评论

是的,但是还有更多地方值得我们深思

1 jedis为什么要暴漏这么个危险的API给用户使用(即要求用户自觉的close,不自觉后果自负),
而这种增加用户操作复杂度的API是可以避免的,所以在我们开发相关框架给别人使用的时候,尽量避免出现这种情况。

2 可以再想想出现这种问题的根本原因是什么,即同步通信中的请求响应不匹配的问题,
这种应该是很容易出现的,给我们的启示就是:在一开始设计的时候就要去考虑这一点,从而就可以避免造出这么一个大坑
jedis版本够老的啊 新版本都已经弃用了 直接使用 jedis.close();
2016/08/26 14:26
jedis版本够老的啊 新版本都已经弃用了 直接使用 jedis.close();
2016/08/26 10:46

引用来自“gzgz8080”的评论

github上已经有人发现这个问题,并且都fix了
https://github.com/xetorthio/jedis/issues/186
是的,但是还有更多地方值得我们深思

1 jedis为什么要暴漏这么个危险的API给用户使用(即要求用户自觉的close,不自觉后果自负),
而这种增加用户操作复杂度的API是可以避免的,所以在我们开发相关框架给别人使用的时候,尽量避免出现这种情况。

2 可以再想想出现这种问题的根本原因是什么,即同步通信中的请求响应不匹配的问题,
这种应该是很容易出现的,给我们的启示就是:在一开始设计的时候就要去考虑这一点,从而就可以避免造出这么一个大坑
2016/08/26 10:16
该评论暂时无法显示,详情咨询 QQ 群:点此入群
2016/08/25 22:36
表示在生产环境填过此坑
2016/08/25 16:33
学习
2016/08/25 14:57
感谢分享。不过我使用了1.7 的 try with resource 方法,似乎无形中就避免了这个问题,13
2016/08/25 14:47
自己写个简单的池就好,当然还是要判断是否broken
2016/08/25 10:12

引用来自“65535”的评论

看了下,所以spring-data-redis 已经帮我们避免了这些类的问题。

    // return the connection to the pool
    try {
      if (pool != null) {
        if (!broken) {
          // reset the connection
          if (dbIndex > 0) {
            select(0);
          }
          pool.returnResource(jedis);
          return;
        }
      }
    } catch (Exception ex) {
      // exceptions are handled below
    }

    if (pool != null && broken) {
      pool.returnBrokenResource(jedis);
      return;
    }
嗯,解决方式都差不多
2016/08/25 10:10
看了下,所以spring-data-redis 已经帮我们避免了这些类的问题。

    // return the connection to the pool
    try {
      if (pool != null) {
        if (!broken) {
          // reset the connection
          if (dbIndex > 0) {
            select(0);
          }
          pool.returnResource(jedis);
          return;
        }
      }
    } catch (Exception ex) {
      // exceptions are handled below
    }

    if (pool != null && broken) {
      pool.returnBrokenResource(jedis);
      return;
    }
2016/08/25 09:19
好文,想起了以前使用redis时候的问题,不过以前没这么详细的去分析过
2016/08/25 09:04
jedis版本够老的啊
回复 @
{{emojiItem.symbol}}
返回顶部
顶部