Redis提供各种语言版本的客户端,详见官网:https://redis.io/
而我们本次介绍的Java语言连接Redis.
其中有黄色五角星为常用的稳定版本,该介绍使用的Jedis版本,如图:
其中官网上介绍maven连接的例子:https://github.com/xetorthio/jedis
如图:
根据官网上提供的例子我们创建一个maven项目(也可以使用Java项目),拷贝redis需要依赖。
代码如下:
public class Redistest { public static void main(String[] args) { //创建连接 Jedis jedis = new Jedis("192.168.1.104",6379); System.out.println("Connection to server sucessfully"); System.out.println(jedis); jedis.set("foo", "bar"); String value = jedis.get("foo"); System.out.println(value); } }pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo.redis</groupId> <artifactId>redis</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>redis</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!--jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- redisson 测试方式,此处可以忽略,有兴趣可以试试这个jar文件 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> </dependencies> </project>而运行该程序会出现如下错误,如图:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out at redis.clients.jedis.Connection.connect(Connection.java:207) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93) at redis.clients.jedis.Connection.sendCommand(Connection.java:126) at redis.clients.jedis.Connection.sendCommand(Connection.java:117) at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:564) at redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2138) at com.demo.redis.test.Redistest.main(Redistest.java:14) Caused by: java.net.SocketTimeoutException: connect timed out at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:75) 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:157) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) at java.net.Socket.connect(Socket.java:579) at redis.clients.jedis.Connection.connect(Connection.java:184) ... 6 more
错误的提示是connect timed out,问题产生主要在以下几个方面:
1、网络是否能ping通
2、Linux防火墙导致连接延迟
3、redis配置是否让本机访问.
对应第一个问题,只能去查看网络连接的问题了,此处不再描述。
对应第二个问题,只要关闭Linux防火墙即可以, 命令:service iptables stop,也可以通过命令永久关闭防火墙
对应第三个问题,只要修改配置文件xxx.conf中bind对应的主机或者注释点bind对应的主机即可。
而我的配置文件在/etc/redis/6379.conf下,执行vi /etc/redis/6379.conf,
(修改自己的配置文件,可能你配置文件为redis.conf)找到bind 127.0.0.1
此处有2种修改方式:
第一种就是直接在bind 127.0.0.1前面加上“#”将其注释,让任何机器都可以连接.
第二种就是在后面再配置一个 bind xxx.xxx.xxx.xxx地址,也就是你eclipse调用机器的ip地址。
而我这边直接注释掉,让所有机器都能访问.然后重启服务;
而此时在运行程序,错误变化为如下:
Connection to server sucessfully redis.clients.jedis.Jedis@8c5ea2 Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Software caused connection abort: recv failed at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202) at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40) at redis.clients.jedis.Protocol.process(Protocol.java:151) at redis.clients.jedis.Protocol.read(Protocol.java:215) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340) at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239) at redis.clients.jedis.Jedis.set(Jedis.java:121) at com.demo.redis.test.Redistest.main(Redistest.java:13) Caused by: java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121) at java.net.SocketInputStream.read(SocketInputStream.java:107) at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196) ... 7 more 出现该错误的原因通过baidu还真没有找出解决方案,后面通过代理服务器用Google搜索,原来是程序内部需要权限验证,那只能给redis数据库配置个密码。同样需要修改redis的配置文件,执行vi /etc/redis/6379.conf找到#requirepass xxxxxx,如图;
去掉此处的注释,requirepass后面对应的redis是我修改登录redis的密码,然后保存,重启服务。
这时候将代码修改为如下并运行,即可以把数据写到redis数据库中了,如图:
public static void main(String[] args) { //创建连接 Jedis jedis = new Jedis("192.168.1.104",6379); System.out.println("Connection to server sucessfully"); System.out.println(jedis); jedis.auth("redis");//验证密码 jedis.set("foo", "bar"); String value = jedis.get("foo"); System.out.println(value); }