golang连接redis,遇到报错redis报-ERR max number of clients reached错误。首先是自己的代码里面用到了redis的连接池,
var pool *redis.pool
func main() {
pool = newRedisPool(REDISHOST+":6379", "")
go userLoginLog()
....
}
func userLoginLog() {
for {
redisConn := pool.Get()
defer redisConn.Close()
listLog, err := redis.String(redisConn.Do("LPOP", "list"))
........
}
}
func newRedisPool(server, password string) *redis.Pool {
return &redis.Pool{
MaxIdle: 10,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server)
if err != nil {
return nil, err
}
if _, err := c.Do("AUTH", password); err != nil {
c.Close()
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
}
}
}
就是上面的这段代码,执行一段时间后,频繁的报“ ERR max number of clients reached ”错误。google后,发现是
可能是因为客户端接入太多,也是可能是因为系统最大文件描述符数过小。仔细查看代码,才发现原来下面的这段代码:
defer redisConn.Close()
实际上根本没有执行过。之前用mysql的连接池的时候,也遇到类似的错误了,可惜记性不好哈。在redis的机子上执行如下代码,发现redis的连接数已经10000多个了。
[root@Web-DB ~]# netstat -an|grep 6379|wc -l
10003
果然是redis的连接数过多导致的。应该在执行完一次循环后就调用
redisConn.Close()
因为之前是死循环,所以defer永远没有执行。