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

当Redis在开发环境中使用时,由于项目重启未正确关闭连接池,导致大量未释放的连接,引发'err max number of clients reached'错误。解决办法是在关闭项目时回收连接池,例如在Java中使用JedisPoolConfig配置并确保调用destroy方法,在Go中使用redis.Pool并管理好连接的生命周期。例如通过设置MaxIdle和 IdleTimeout,以及在每次使用后调用Close方法关闭连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


就是上面的这段代码,执行一段时间后,频繁的报“ 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永远没有执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值