django redis error: max number of clients reached

 在日常测试中,突然遇到这么一个错误,怎么也过不去了。

查询了错误栈,发现是redis错误。

而这个redis错误是说超过了最大客户端连接数,我们又没多少redis-client 怎么会超过最大数呢。

OperationalError(u'max number of clients reached',)

然后用 client list

django redis error: max number of clients reached发现特别多的连接,而且有好多都是ttl ping等简单的操作。

在这些操作后没有执行主动关闭连接操作,导致redis一直保持着连接,等待client重新连接。

所以说 解决的关键就在于关闭连接。

我们有3个方案:

1.重启redis

2.在连接完成后手动关闭redis连接

3.设置redis连接超时时间

最后我们选择了1,因为操作简单。哈哈哈哈~

当然了

1 操作简单,也不会丢失数据,但只能临时解决问题,之后还是会有同样的问题

2 需要排查所有没有自动关闭连接的地方,然后增加自动关闭的代码

3 简单粗暴,只要超时的就会给关闭。但是不适用有订阅/发布的项目,因为订阅/发布的redis大部分时间都是空闲的,设置超时时间所有的订阅发布就会失效。

我觉得 我们的项目里应该用一个连接池,就是所有的redis实例 都用单例模式,这样不就解决了。