背景
项目联调过程中,突然报错Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
解决过程
感觉是个常见错误,网上搜了一下常见的原因:
- 没有正确关闭连接,连接池耗尽。项目使用的是spring的redisTemplate,框架自动关闭连接,可以排除;
-
项目并发量较大,连接数量确实不够。连接池最大连接数默认是8,我把项目的配置改成50试了一下,还是不行;
这时,同事提示我说有个同事在改造redis集群,可能动了这台机器上的redis(公司比较low,还是单点的redis)。于是我登上redis部署的机器,重启redis,第一次重启命令为:./redis-server。重启后,我用自己电脑的客户端去连接,redis-cli -h 10.60.1**.5* -p 6379,可以连上。然后测试项目接口,仍然报错,报错信息如下:
从报错提示看,应该把protected-mode关闭。第一次重启的时候犯了个错,没带上配置文件。首先确认配置文件中protected-mode是关闭状态,再次重启,重启命令为:./redis-server /usr/local/redis-5.0.8/redis.conf。然后悲催的发现自己的客服端redis-cli -h 10.60.1**.5* -p 6379也连不上了,一脸懵。。。
各种搜贴尝试均失败后,改造redis集群的同事回来了,告诉我他改了配置,他把下图这行配置的注释取消了。
这行配置的意思是只能本机访问redis,这就是为什么我使用redis-cli -h 10.60.1**.5* -p 6379连接失败的原因。
总结
1.启动redis请带上配置文件./redis-server /**/redis.conf
2.检查配置文件,protected-mode:是否开启protected模式;bind 127.0.0.1:那么 Redis 只接受来自运行它的计算机上的客户端的连接。