1 redis无法获得连接了
首先把异常开关打开:
// 连接耗尽时是否阻塞, false报异常,true阻塞直到超时, 默认true
jedisPoolConfig.setBlockWhenExhausted(false);
一旦无可用连接,这样能看到大量的异常:
Caused by: redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:51)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:276)
... 70 more
Caused by: java.util.NoSuchElementException: Pool exhausted
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:453)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
at redis.clients.util.Pool.getResource(Pool.java:49)
原因在哪?用redis命令查看:client list
或info clients
,可以看到大量的连接未释放:
id=92099 addr=172.16.3.19:54493 fd=363 name= age=158 idle=158 flags=N db=11 sub=0
psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=sinter
还有一种方法,看本地连接数,以保证连接数不要超限:
netstat -an | grep 6379 | grep EST | wc -l
以及收集tcp端口的数据:
sudo tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w redis.cap
使用tcpdump -r redis.cap
来查看监听收集的内容
从3.0开始,释放方法是jedis.close(),添加主动释放代码即可,多命令见这里。
这些连接可以用CLIENT KILL ip:port
来关闭,删除更多可以用以下命令:
127.0.0.1:6379[11]> client kill type normal
(integer) 1003
1000就是连接池里的maxTotal配置项
最后还剩下一个:
127.0.0.1:6379[11]> client list
id=92752 addr=127.0.0.1:58242 fd=15 name= age=1094 idle=0 flags=N db=11 sub=0
psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
更多详情可以看看这里
更多redis连接的问题的定位可以查看这里,列举的还比较多。