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));
		}
	}
}
 

输出:

 

posted @ 2017-08-29 22:42  半生戎马,共话桑麻、  阅读(1746)  评论(0)    收藏  举报
levels of contents