redis连接问题

November 27, 2019
redis 连接

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 listinfo 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连接的问题的定位可以查看这里,列举的还比较多。


loading