19-用Java连接Redis报错:connect timed out
背景
使用Java连接Redis的时候,报错:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:134)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:69)
at redis.clients.jedis.Connection.sendCommand(Connection.java:86)
at redis.clients.jedis.BinaryClient.ping(BinaryClient.java:82)
at redis.clients.jedis.Jedis.ping(Jedis.java:34)
at com.atguigu.redis.test.TestPing.main(TestPing.java:8)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at redis.clients.jedis.Connection.connect(Connection.java:129)
... 5 more
Redis是安装在VMware虚拟机中的CentOS系统中的,报这个错误的原因是连接超时,解决方法有两个:
(1)打开windows下的dos,输入ping 虚拟机网卡IP地址,看看windows和Linux是否能通讯,如果不能通讯,请参考下面做法进行配置:
http://www.cnblogs.com/josephcnblog/articles/7446284.html
这时候应该可以在windows中ping的通Linux了
(2)在win中能ping通Linux,并且在Linux中的redis可以使用命令行正常操作,但是不能使用Java连接Redis
在保证两者之间能够正常通讯的情况下,设置redis的安装目录下的redis.conf文件中是否绑定了虚拟机网卡的IP地址,
如笔者的redis安装目录是:myredis/redis.conf,进入myredis目录,用vim 打开这个文件,作如下配置,绑定IP(假设虚拟机网卡的IP是192.168.0.101)
vim reids.conf
改好了之后,按esc键,然后输入下面命令保存退出
:wq!
重新连接redis,重新执行Java代码,如果还是不行,那么就是Linux的防火墙的问题了!
在CentOS 7中默认使用firewall做为防火墙,下面是启动&关闭防火墙的命令:
// 启动firewall systemctl start firewalld.service // 关闭firewall systemctl stop firewalld.service
执行第二条命令,把防火墙关闭掉
重新执行Java代码,发现可以连接Redis了
Java代码如下:
package com.atguigu.redis.test; import redis.clients.jedis.Jedis; public class TestPing { public static void main(String[] args) { Jedis jedis = new Jedis("192.168.0.101", 6379); System.out.println("=============" + jedis.ping()); // 如果连接成功,就会输出pong } }
打印结果:
测试范例:
package com.atguigu.redis.test; import java.util.Iterator; import java.util.Set; import redis.clients.jedis.Jedis; public class TestPing { public static void main(String[] args) { // 连接redis Jedis jedis = new Jedis("192.168.0.101", 6379); System.out.println("=============" + jedis.ping()); // 设置几个key jedis.set("k1", "v1"); jedis.set("k2", "v2"); jedis.set("k3", "v3"); // 获取所有key Set<String> keys = jedis.keys("*"); Iterator<String> iterator = keys.iterator(); while (iterator.hasNext()) { String key = iterator.next(); System.out.println("key: " + key + ", value:" + jedis.get(key)); } } }
输出: