http://www.redis.cn/commands.html#server

说明:
redis报max number of clients错误,可能是因为客户端接入太多,也是可能是因为系统最大文件描述符数过小。

解决:

1.碰到因为客户端接入太多,可以通过修改redis.conf的maxclients XXXX,设置同一时间最大客户端连接数(默认0,表示不限制)来解决。
# netstat -an|grep 6379|wc -l
4602

当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息。不过最好还是了解一下都谁来连接redis的,是不是连接方式有问题,毕竟redis一般是用来做缓存,不太可能有太多的client来连接。
redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数


最近在开发的在线考试系统平台,开发中用到redis缓存系统,由于第一次用遇到了不少问题。而且网上的资料都不是很正规统一,查看资料和问题都是很零散。

一个月以前,开发中redis出现了“err max number of clients reached”,项目启动失败。当时我重启了项目,修改了redis的最大连接数为无限制,以为问题很简单。

现在一个月以后,问题又出现了,项目组的开发人员项目都启动失败报错,我认为这个问题需要重视下,如果投产了,问题再出现就麻烦了。

在网上查看大量的资料,还是找不到解决办法。因为项目平时不报错,用了一个月左右的时间,问题再次出现,肯定是一个长期使用压力造成的问题。

最后和同事讨论,经同事提醒才发现是redis连接池在关闭项目的时候,需要摧毁连接池,不然redis在开发的过程中,长时间经常重启项目会累积很多不能释放的连接。

代码如下:

<bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">   
    <property name="testWhileIdle" value="true"/>  
</bean>  
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="destroy">  
    <constructor-arg ref="jedisConfig" />  
    <constructor-arg value="localhost" />  
    <constructor-arg type="int" value="6379" />   
</bean>

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