问题描述
在Django的websocket连接中,借用Redis实现消息订阅的功能,突然出现问题,websocket端连接不上服务器,在uwsgi日志中发现是握手中连接Redis出错,进而导致握手失败,日志
ConnectionError: max number of clients reached
解决办法
在查找资料后,得知主要有2个原因会导致出现此问题
- Redis允许的连接数太小,并发的客户端超过这个值
- 客户端未及时关闭,导致Redis的连接数被耗尽
打开Redis的配置文件,检查maxclients参数,发现为1000,客户端当前应该是不超过1000的,使用命令检查一下连接数
netstat -an|grep redis | wc -l
1001
居然有那么多连接,看来自己遇到的问题应该是第二种,应该是客户端的websocket断开后,代码逻辑中没有释放连接,导致运行一段时间后出现这个问题。
发现问题,解决的办法应该也很简单了
1,在websocket的connection lost事件中,释放redis
2,简单一点,给redis添加一个timeout时间,超时后自动释放,当然此方法不适合频繁的Redis连接,毕竟过一段时间Redis才会释放