折腾一上午在windows server 2012 R2安装了redis windows 版本。本机cmd远程连接服务器上的redis没有问题。
但是java的jedis客户端连接远程的redis又又出现问题!!(整天除了惊喜就是满脑子的疑惑,还担心被导师说你怎么那么笨)
打开日志显示:
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
Caused by: java.net.SocketTimeoutException: connect timed out
Could not get a resource from the pool。
导致这个原因的有很多种,我采取了一一排查的措施。
以下的措施对寻找redis的远程连接的异常原因很有帮助。
1>:本机cmd再次连接远程的redis,顺利连接。排除了服务器防火墙以及端口没配置的问题。
2>:检查jedis的配置问题,特别注意pool = new JedisPool(config, host, port, time out, password);
是否忘记了password;
time out的单位是毫秒!!!
3>:jedisPool的最大等待时间maxWaitMillis设置是否合理;
(表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException)
4>:用完的jedis实例是否回收了
按照以上四个步骤的顺序,依次排查
- 本机能远程连接redis,排除第1种可能;
- timeout设置合理(10000),注意到单位是毫秒,没有忘记密码,排除第2种可能
- maxWaitMillis默认一直等待(-1L ),我设置maxWaitMillis为10000足够,排除第3中可能。
- 用完redis之后发现没有返回资源
找到问题的所在,于是增加如下代码,实现jedis实例返回连接池
try {
} catch (Exception e) {
// TODO: handle exception
// 释放redis对象
pool.returnBrokenResource(jedis);
} finally {
// 返还到连接池
pool.returnResource(jedis);
}