博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jedis初探
阅读量:6591 次
发布时间:2019-06-24

本文共 3529 字,大约阅读时间需要 11 分钟。

hot3.png

一. Jedis连接Redis

1. 打开6379端口(或者关闭防火墙)

Linux操作系统并没有打开6379端口,所以如果直接访问会报错,需要更改其防火墙配置,输入;

vim /etc/sysconfig/iptables

在配置中增加一条规则:

080946_3MMi_3381212.png

这样就把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文件里有这样一行:

151802_9A2U_3381212.png

这里限制了只能(运行redis服务的)本机访问,导致外部访问的时候报如下错误:

java.net.ConnectException: Connection refused: connect

151935_tCQa_3381212.png

解决办法:

添加校验密码,具体步骤如下:

1).将 bind 127.0.0.1这行注释

2).设置校验密码。将 requirepass foobared 这行注释去掉,设置成“requirepass 密码”的格式,这里密码最好设成强密码,复杂一些最好

152911_Y4c5_3381212.png

或者通过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对象的时候,加上校验密码

153804_iq8m_3381212.png

5).若要在(安装redis的)Linux主机中打开redis客户端,需要输入校验密码,如下图,使用"auth 密码"的形式即可,否则无法使用redis命令,会报“NOAUTH Authentication required”的错

145827_nUDm_3381212.png

以上只是一种解决方案,还有其他方法:

方法1:将bind 127.0.0.1 改成 bind 0.0.0.0,其他项不用动(已试验可行)

方法2: 将bind 127.0.0.1注释,并关闭保护模式,即将下面图中的yes改成no(已试验可行)

154854_CSW1_3381212.png

2. eclipse中引入jedis的jar包报错

在eclipse中的maven资源目录查看,jar包已经引入了,但是还是报 “Missing artifact” 的错误

解决办法:

可以参考另一篇博客:

 

三. 网上博客资料中的问题

在网上查阅资料的时候,很多博客,比如下面这个:

,描述了通过直接添加一条"bind+ip"的方式使得外网可访问,但是经过我亲自试验并不成功,结果不但安装redis服务的本机连接不上redis,外部代码访问也会报错,这里记录错误还原如下

a).redis.conf中添加一条bind+ip:

164336_Hy3s_3381212.png

启动后发现本机都连不上redis了:

164038_EAjy_3381212.png

b).外部代码访问出错:

164814_Of0j_3381212.png

164136_vYQ9_3381212.png

按照这篇博客的描述,说写成下面这样的形式,(ip之间用空格隔开)经我试验也是不行的,错误同上

154842_V3Jf_3381212.png

那么,为什么这样写是不行的呢?经我多番查阅,发现原来有人和我遇到了一样的问题,并在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.(这里主要讲了防火墙的问题)

 

 

转载于:https://my.oschina.net/u/3381212/blog/1563832

你可能感兴趣的文章
oracle kill所有plsql developer进程
查看>>
12c rac 实例无法启动之磁盘组空间耗尽
查看>>
keepalived双机热备原理及实例部署LVS+keepalived
查看>>
曲线学习PyQt5方案一
查看>>
爬虫采集-基于webkit核心的客户端Ghost.py [爬虫实例]
查看>>
企业私有云之rabbitmq高可用
查看>>
OpenCV学习】矩阵运算和操作2
查看>>
nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器
查看>>
Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境
查看>>
关于在arm裸板编程时使用printf问题的解决方法
查看>>
开源人工智能技术将改变一切
查看>>
红帽专家谈 Ceph 与 Gluster 开源存储路线
查看>>
2015 上半年 JavaScript 使用统计数据
查看>>
《PaaS程序设计》一1.2 云能为创新做什么
查看>>
《OpenGL ES 3.x游戏开发(上卷)》一2.4 文件I/O
查看>>
《写给程序员的数据挖掘实践指南》——5.2. 10折交叉验证的例子
查看>>
DevOps:软件架构师行动指南2.2 云的特性
查看>>
JVM性能优化, Part 5:Java的伸缩性
查看>>
《Python算法教程》——1.6 如果您感兴趣
查看>>
《正则表达式经典实例(第2版)》——2.18 向正则表达式中添加注释
查看>>