一. Jedis连接Redis
1. 打开6379端口(或者关闭防火墙)
Linux操作系统并没有打开6379端口,所以如果直接访问会报错,需要更改其防火墙配置,输入;
vim /etc/sysconfig/iptables
在配置中增加一条规则:
这样就把6379端口打开了(可以在上一条规则使用yy+p,把上条规则复制黏贴,然后再更改端口号,免去敲一大堆命令),改完记得使用 :wq 保存并退出。改后需要重启防火墙,输入:
service iptables restart
当然,也可以直接关闭防火墙后进行访问,就不会报连接超时的错误了
2. maven依赖
redis.clients jedis 2.9.0
3. 代码示例:
package com.imooc.jedis;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;/** * Jedis的测试 * @author xzf * */public class JedisDemo1 { @Test /** * 单实例的测试 */ public void demo1(){ //1. 设置IP地址和端口 Jedis jedis=new Jedis("10.2.1.107",6379); jedis.auth("123456");//redis中设置了校验密码; //2. 保存数据 jedis.set("name", "imooc"); //3. 获取数据 String value=jedis.get("name"); System.out.println(value); //4.释放资源 jedis.close(); } @Test /** * 连接池方式连接 */ public void demo2(){ //获取连接池的配置对象 JedisPoolConfig config=new JedisPoolConfig(); //设置最大连接数 config.setMaxTotal(30); //设置最大空闲连接数 config.setMaxIdle(10); //获得连接池(此处可以考虑改成单例模式,使用getInstance获得连接池对象) JedisPool jedisPool=new JedisPool(config,"10.2.1.107",6379); //获得核心对象 Jedis jedis=null; try { //通过连接池获得连接 jedis=jedisPool.getResource(); jedis.auth("123456"); //设置数据 jedis.set("name","张三"); String value=jedis.get("name"); System.out.println(value); } catch (Exception e) { e.printStackTrace(); }finally { //释放资源 if (jedis!=null) { jedis.close();//将jedis还到连接池中,老版本的写法jedisPool.returnResource已经被废弃 } if (jedisPool!=null) { //关闭连接池(非必需) jedisPool.close(); } } } }
二. 遇到的一些问题
1. Redis默认限制了外网的访问
在redis安装目录中的redis.conf文件里有这样一行:
这里限制了只能(运行redis服务的)本机访问,导致外部访问的时候报如下错误:
java.net.ConnectException: Connection refused: connect
解决办法:
添加校验密码,具体步骤如下:
1).将 bind 127.0.0.1这行注释
2).设置校验密码。将 requirepass foobared 这行注释去掉,设置成“requirepass 密码”的格式,这里密码最好设成强密码,复杂一些最好
或者通过redis命令来设置:
- [root@itcast01 redis-3.2.1]# redis-cli- 127.0.0.1:6379> config set requirepass 123456- OK- 127.0.0.1:6379>
3).重启redis
4).在代码中获取redis对象的时候,加上校验密码
5).若要在(安装redis的)Linux主机中打开redis客户端,需要输入校验密码,如下图,使用"auth 密码"的形式即可,否则无法使用redis命令,会报“NOAUTH Authentication required”的错
以上只是一种解决方案,还有其他方法:
方法1:将bind 127.0.0.1 改成 bind 0.0.0.0,其他项不用动(已试验可行)
方法2: 将bind 127.0.0.1注释,并关闭保护模式,即将下面图中的yes改成no(已试验可行)
2. eclipse中引入jedis的jar包报错
在eclipse中的maven资源目录查看,jar包已经引入了,但是还是报 “Missing artifact” 的错误
解决办法:
可以参考另一篇博客:
三. 网上博客资料中的问题
在网上查阅资料的时候,很多博客,比如下面这个:
,描述了通过直接添加一条"bind+ip"的方式使得外网可访问,但是经过我亲自试验并不成功,结果不但安装redis服务的本机连接不上redis,外部代码访问也会报错,这里记录错误还原如下
a).redis.conf中添加一条bind+ip:
启动后发现本机都连不上redis了:
b).外部代码访问出错:
按照这篇博客的描述,说写成下面这样的形式,(ip之间用空格隔开)经我试验也是不行的,错误同上
那么,为什么这样写是不行的呢?经我多番查阅,发现原来有人和我遇到了一样的问题,并在segmentfault上有提问(问题地址:),这个问题下的回答指出,原来是大家对redis英文翻译上出现了偏差,于是被带偏了
找到如下解释:
关于 bind
翻看网上的文章,此处多翻译为 “指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项”。这种解释会 totally 搞糊涂初学者,甚至是错误的。该处的英文原文为
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections. # bind 127.0.0.1该处说明 bind 的是 interface,也就是说是网络接口。服务器可以有一个网络接口 (通俗的说网卡),或者多个。打个比方说机器上有两个网卡,分别为 192.168.205.5 和 192.168.205.6,如果 bind 192.168.205.5,那么只有该网卡地址接受外部请求,如果不绑定,则两个网卡口都接受请求。
OK,不知道讲清楚没有,在举一个例子。在我上面的实验过程中,我是将 bind 项注释掉了,实际上我还有一种解决方案。由于我 redis 服务器的地址是
192.168.1.4
。如果我不注释 bind 项,还有什么办法呢?我可以做如下配置:# bind 192.168.1.4
这里很多人会误以为绑定的 ip 应该是请求来源的 ip。其实不然,这里应该绑定的是你 redis 服务器本身接受请求的 ip。
原文链接:
四. 参考资料:
1.(详细,讲的很好,里面包括了jedis对redis各种数据类型的操作)
2.(这里主要讲了防火墙的问题)