今天遇到一个问题,搞了将近小半天也没有解决,最后我给出来的结论是 Spring Boot Redis Starter 里用的 Jedis 的 Bug 导致。
我来描述一下问题过程,今天我为了测试 Spring Boot 和 Redis 相结合,写了一个 Demo 程序,先来连接我本地的 Redis 服务,测试了一下没有问题,然后我想试试连接远程的 Redis 服务,我之前在自己的一台服务器上搭了 Redis 服务,在我的一个正在运行的 Python 项目中用到了这个库,说明服务是没有问题的。并且我已经将这个服务端口监听到了 0.0.0.0
,所以外部是可以访问的,唯一的区别是我加了密码验证。我在 application.yml
中配置 host
和 password
后,进行测试,发现报错:
1 | 2017-08-16 17:47:21.908 ERROR 55442 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool] with root cause |
然后我根据网上的给出的方案,尝试修改 spring.redis.pool
相关的各种参数,都没有解决。网上有的说是 Redis 的连接数太高导致的,我看了等下 Redis 的 info 都正常。
我在本地用命令 redis-cli -h hostname -a password
也是可以连上的,先不输密码登录成功后用 AUTH + password
的方式也可以访问。
因为我自己服务器上的 Redis 在使用中,不方便修改密码,所以我在公司 lc7 的服务器上搭了个 Redis,修改配置监听 0.0.0.0
不过没有设置密码,修改待测试程序的配置文件,发现可以读到,然后又把 lc7 的 Redis 服务加上了密码,再次测试还是没有问题。
后来我猜是不是我自己服务器上的密码设置的太长了,我又把 lc7 的密码改为和我自己服务器相同的密码,测试后还是没问题。
然后我又对比了下两个机器上安装的 Redis 版本,发现我的服务器上的版本为 2.x,而 lc7 的为 3.x 版本,于是我又冒着风险将我自己服务器的 Redis 进行了升级,升级完先检查了下用到这个 Redis 的其他应用能不能正常工作,检查没有问题后,修改我要测试程序的配置文件来连接这个 Redis,结果还是报那个错误。
最后,我冒着自己服务器上所部署的应用暂时不可用的风险,去掉了 Redis 的密码,这时候测试发现没问题了。
综上,就是这个 Bug 非常迷的论述。暂时没有找到解决方法。