Jedis初探

一. Jedis鏈接Redis

1. 打開6379端口(或者關閉防火牆)

Linux操做系統並無打開6379端口,因此若是直接訪問會報錯,須要更改其防火牆配置,輸入;java

vim /etc/sysconfig/iptables

在配置中增長一條規則:redis

這樣就把6379端口打開了(能夠在上一條規則使用yy+p,把上條規則複製黏貼,而後再更改端口號,免去敲一大堆命令),改完記得使用 :wq 保存並退出。改後須要重啓防火牆,輸入:vim

service iptables restart

固然,也能夠直接關閉防火牆後進行訪問,就不會報鏈接超時的錯誤了segmentfault

 

2. maven依賴

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

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: connecteclipse

解決辦法:

添加校驗密碼,具體步驟以下:maven

1).將 bind 127.0.0.1這行註釋測試

2).設置校驗密碼。將 requirepass foobared 這行註釋去掉,設置成「requirepass 密碼」的格式,這裏密碼最好設成強密碼,複雜一些最好ui

或者經過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」 的錯誤

解決辦法:

能夠參考另外一篇博客:http://www.javashuo.com/article/p-beyaozyf-mg.html

 

三. 網上博客資料中的問題

在網上查閱資料的時候,不少博客,好比下面這個:

http://blog.csdn.net/ksdb0468473/article/details/52848608,描述了經過直接添加一條"bind+ip"的方式使得外網可訪問,可是通過我親自試驗並不成功,結果不但安裝redis服務的本機鏈接不上redis,外部代碼訪問也會報錯,這裏記錄錯誤還原以下

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

啓動後發現本機都連不上redis了:

b).外部代碼訪問出錯:

按照這篇博客http://blog.csdn.net/fxq8866/article/details/58238802的描述,說寫成下面這樣的形式,(ip之間用空格隔開)經我試驗也是不行的,錯誤同上

那麼,爲何這樣寫是不行的呢?經我多番查閱,發現原來有人和我遇到了同樣的問題,並在segmentfault上有提問(問題地址:Redis bind 多個 IP 出錯),這個問題下的回答指出,原來是你們對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。

原文連接:http://blog.csdn.net/hel12he/article/details/46911159

 

四. 參考資料:

1.Jedis 鏈接虛擬機下的 Redis 服務(詳細,講的很好,裏面包括了jedis對redis各類數據類型的操做)

2.http://blog.csdn.net/ksdb0468473/article/details/52126474(這裏主要講了防火牆的問題)

相關文章
相關標籤/搜索