Redis概述與Redis集羣(二)


4、Jedis鏈接redis服務器

4.1 項目結構

  須要導入兩個包。java

項目結構
jedis

4.2 Jedis鏈接redis服務端

package com.xkt.jedis;

import java.util.Set;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.Jedis;

/**
 * @author lzx
 *
 */
public class JedisTest {

	private Jedis jedis = null;

	/**
	 * new Jedis(host, port, timeout);
	 * 
	 * host redis所在服務器地址 port 端口 默認6379 timeout 鏈接超時時間,默認5s
	 * 
	 * 鏈接reids注意事項: (1)防火牆問題 (2)Ip綁定。把Redis的配置文件redis.conf裏的bind localhost(或者bind
	 * 127.0.0.1,代表只有該主機才能訪問)註釋掉。 (3)protected-mode保護模式 若是碰到,將protected-mode改爲no便可。
	 */
	@Before
	public void before() {
		// 一、建立客戶端Jedis
		jedis = new Jedis("192.168.109.3", 6379, 5);

		// 2.指定密碼
		jedis.auth("1234");
	}

	@After
	public void after() {
		// 關閉資源
		if (null != jedis) {
			jedis.close();
		}
	}

	/**
	 * 測試鏈接
	 */
	@Test
	public void testConn() {

		String pong = jedis.ping();
		System.out.println(pong);
	}

	/**
	 * 得到全部key
	 */
	@Test
	public void getAllKeys() {

		Set<String> keys = jedis.keys("*");
		for (String key : keys) {
			System.out.println(key);
		}
	}
}

鏈接reids注意事項:node

  • 防火牆問題
  • Ip綁定。把Redis的配置文件redis.conf裏的bind localhost(或者bind 127.0.0.1,代表只有該主機才能訪問)註釋掉。
  • protected-mode保護模式 若是碰到,將protected-mode改爲no便可。

5、Redis集羣

5.1 Redis集羣簡介

  所謂的集羣,就是經過添加服務器的數量,提供相同的服務,從而讓服務器達到一個穩定、高效的狀態。redis

  1. redis集羣中,每個redis稱之爲一個節點。
  2. redis集羣中,有兩種類型的節點:主節點(master)、從節點(slave)。
  3. redis集羣,是基於redis主從複製實現。

5.2 主從複製

5.2.1 主從複製是什麼

  • 主從複製模型中,有多個redis節點。
  • 其中,有且僅有一個爲主節點Master。從節點Slave能夠有多個。
  • 只要網絡鏈接正常,Master會一直將本身的數據更新同步給Slaves,保持主從同步。
模型

5.2.2 主從複製的特色

  1. 主節點Master可讀、可寫.
  2. 從節點Slave只讀。(read-only)
  • 所以,主從模型能夠提升讀的能力,在必定程度上緩解了寫的能力。由於能寫仍然只有Master節點一個,能夠將讀的操做所有移交到從節點上,變相提升了寫能力。

5.3 Redis-cluster集羣

  這裏咱們介紹Redis-cluster集羣,由於哨兵模式當併發寫請求較大時,哨兵模式並不能緩解寫壓力。數據庫

  咱們知道只有主節點才具備寫能力,那若是在一個集羣中,可以配置多個主節點,是否是就能夠緩解寫壓力了呢?這就引出了咱們的redis-cluster集羣模式ruby

5.3.1 Redis-cluster集羣概念

  1. 由多個Redis服務器組成的分佈式網絡服務集羣;
  2. 集羣之中有多個Master主節點,每個主節點均可讀可寫;
  3. 節點之間會互相通訊,兩兩相連;
  4. Redis集羣無中心節點。
圖示

5.3.2 集羣節點複製

圖示
  • 在Redis-Cluster集羣中,能夠給每個主節點添加從節點,主節點和從節點直接遵循主從模型的特性。服務器

  • 當用戶須要處理更多讀請求的時候,添加從節點能夠擴展系統的讀性能。網絡

5.3.3 故障轉移

  Redis集羣的主節點內置了相似Redis Sentinel的節點故障檢測和自動故障轉移功能,當集羣中的某個主節點下線時,集羣中的其餘在線主節點會注意到這一點,並對已下線的主節點進行故障轉移。併發

圖示

  集羣進行故障轉移的方法和Redis Sentinel進行故障轉移的方法基本同樣,不一樣的是,在集羣裏面,故障轉移是由集羣中其餘在線的主節點負責進行的,因此集羣沒必要另外使用Redis Sentinel。分佈式

5.3.4 集羣分片策略

  • Redis-cluster分片策略,是用來解決key存儲位置的。函數

  • 集羣將整個數據庫分爲16384個槽位slot,全部key-value數據都存儲在這些slot中的某一個上。一個slot槽位能夠存放多個數據,key的槽位計算公式爲:slot_number=crc16(key)%16384,其中crc16爲16位的循環冗餘校驗和函數。

  • 集羣中的每一個主節點均可以處理0個至16383個槽,當16384個槽都有某個節點在負責處理時,集羣進入上線狀態,並開始處理客戶端發送的數據命令請求。

圖示

5.3.5 集羣redirect轉向

  • 因爲Redis集羣無中心節點,請求會隨機發給任意主節點;
  • 主節點只會處理本身負責槽位的命令請求,其它槽位的命令請求,該主節點會返回客戶端一個轉向錯誤;
  • 客戶端根據錯誤中包含的地址和端口從新向正確的負責的主節點發起命令請求。
圖示

6、Redis-cluster集羣搭建

6.1 準備工做

  1. 安裝ruby環境
  • yum -y install ruby
  • yum -y install rubygems
  1. 安裝ruby和redis的接口程序

  拷貝redis-3.0.0.gem至/usr/local下,執行安裝:

  • gem install /usr/local/redis-3.0.0.gem

6.2 集羣規劃

  1. Redis集羣最少須要6個節點,能夠分佈在一臺或者多臺主機上。 咱們測試採用一臺主機上建立僞分佈式集羣,不一樣的端口表示不一樣的redis節點,以下:
  • 主節點:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003

  • 從節點:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006

  1. 在/usr/local/redis下建立redis-cluster目錄,其下建立700一、7002。。7006目錄([root@node redis-cluster]# mkdir 7001 7002 7003 7004 7005 7006),以下:
圖示
  1. 將redis解壓路徑下的配置文件redis.conf,依次拷貝到每一個700X目錄內,並修改每一個700X目錄下的redis.conf配置文件:
  • 修改bind 爲了其餘機器也能夠訪問
  • cluster-enabled yes 支持集羣
  • daemonized yes 後臺啓動
  • logfile /usr/local/redis/redis-cluster/700X/node.log

  1>必選配置:

  • port 700X
  • bind 192.168.56.3
  • cluster-enabled yes   2>建議配置:
  • daemonized yes
  • logfile /usr/local/redis/redis-cluster/700X/node.log

6.3 啓動每一個結點redis服務

  1. 依次以700X下的redis.conf,啓動redis節點。(必須指定redis.conf文件) 到各自文件夾下啓動,不然可能啓動不了
  • redis-server /usr/local/redis/redis-cluster/700X/redis.conf

6.4 執行建立集羣命令

  1. 進入到redis源碼存放目錄redis/redis-4.10.3/src下,執行redis-trib.rb
  • ./redis-trib.rb create --replicas 1 192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003 192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006
圖示

6.5 查詢集羣信息

  1. 集羣建立成功登錄任意redis結點查詢集羣中的節點狀況
  • ./redis-cli -c -h 192.168.56.3 -p 7001
圖示
  1. 上面命令說明:
  • -c表示以集羣方式鏈接redis,
  • -h指定ip地址,
  • -p指定端口號
  • 登錄集羣后使用如下命令:
  • cluster nodes 查詢集羣結點信息;
  • cluster info 查詢集羣狀態信息。

7、java程序鏈接redis集羣

package com.xkt.redis.test;

import java.util.HashSet;
import java.util.Set;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

/**
 * @author lzx
 *
 */
public class Test {
	
	public static void main(String[] args) {
		//鏈接jediscluster客戶端
		String host ="192.168.109.3";
		
		Set<HostAndPort> nodes =new HashSet<>();
		nodes.add(new HostAndPort(host, 7001));
		nodes.add(new HostAndPort(host, 7002));
		nodes.add(new HostAndPort(host, 7003));
		nodes.add(new HostAndPort(host, 7004));
		nodes.add(new HostAndPort(host, 7005));
		nodes.add(new HostAndPort(host, 7006));
		
		JedisCluster cluster = new JedisCluster(nodes);
		
		String name = cluster.hget("user:id:1", "name");
		System.out.println(name);
		
		cluster.close();
	}

}
相關文章
相關標籤/搜索