Redis:err max number of clients reached 报错解决办法

Redis:err max number of clients reached 报错解决办法

Redis用一段时间之后会报错,经过反复测试和百度、Google之后才发现是redis连接池在关闭项目的时候,需要收回连接池,不然redis在开发的过程中,所有开发人员本地项目连接redis服务器,经常重启项目会累积很多不能释放的连接,

代码如下:

[java] view plain copy

  1. <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
  2. <property name="testWhileIdle" value="true"/>
  3. </bean>
  4. <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
  5. <constructor-arg ref="jedisConfig" />
  6. <constructor-arg value="localhost" />
  7. <constructor-arg type="int" value="6379" />
  8. </bean>


其中 destroy-method="destroy",是关闭web容器的时候,会调用连接池的destroy,关闭和redis的连接,就此隐藏两个月的问题终于解决了。


还有可能是(go语言

代码里面用到了redis的连接池,

[plain] view plain copy

  1. var pool *redis.pool
  2. func main() {
  3. pool = newRedisPool(REDISHOST+":6379", "")
  4. go userLoginLog()
  5. ....
  6. }
  7. func userLoginLog() {
  8. for {
  9. redisConn := pool.Get()
  10. defer redisConn.Close()
  11. listLog, err := redis.String(redisConn.Do("LPOP", "list"))
  12. ........
  13. }
  14. }
  15. func newRedisPool(server, password string) *redis.Pool {
  16. return &redis.Pool{
  17. MaxIdle: 10,
  18. IdleTimeout: 240 * time.Second,
  19. Dial: func() (redis.Conn, error) {
  20. c, err := redis.Dial("tcp", server)
  21. if err != nil {
  22. return nil, err
  23. }
  24. if _, err := c.Do("AUTH", password); err != nil {
  25. c.Close()
  26. return nil, err
  27. }
  28. return c, err
  29. },
  30. TestOnBorrow: func(c redis.Conn, t time.Time) error {
  31. _, err := c.Do("PING")
  32. return err
  33. }
  34. }
  35. }



就是上面的这段代码,执行一段时间后,频繁的报“ ERR max number of clients reached ”错误。google后,发现是 可能是因为客户端接入太多,也是可能是因为系统最大文件描述符数过小。仔细查看代码,才发现原来下面的这段代码:

[plain] view plain copy

  1. defer redisConn.Close()

实际上根本没有执行过。之前用mysql的连接池的时候,也遇到类似的错误了,可惜记性不好哈。在redis的机子上执行如下代码,发现redis的连接数已经10000多个了。

[plain] view plain copy

  1. [root@Web-DB ~]# netstat -an|grep 6379|wc -l
  2. 10003

果然是redis的连接数过多导致的。应该在执行完一次循环后就调用 [plain] view plain copy

  1. redisConn.Close()

因为之前是死循环,所以defer永远没有执行。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部