1. 程式人生 > >Windows下Redis叢集搭建

Windows下Redis叢集搭建

上一篇文章中介紹了Windows下使用cygwin搭建redis單節點,這一篇檔案將在上一篇文章的基礎上搭建redis叢集。

1. 在安裝redis的目錄的同級目錄下新建6個資料夾,7000,70001,7002,7003,7004,7005

      將./redis-stable/src/目錄下面redis-server redis.conf兩個檔案複製到./7000/資料夾中,當前目錄下使用命令:cp ./redis-stable/src/redis-server ./redis-stable/redis.conf ./7000,然後,修改redis.conf檔案中內容,將下列值改為如下:

     port 7000                   #設定埠

     cluster-enabled yes  #開啟叢集支援

     cluster-config-file nodes.conf #節點配置檔名

     cluster-node-timeout 5000 #節點超時時間

      appendonly yes        #設定redis資料操作方式

      daemonize yes        #設定redis預設以後臺程式方式執行

      注意:由於檔案行數較多,可以在命令模式下使用 /要搜尋的內容 來找到指定行,再使用命令 “ : number” 來跳轉到指定行。如果要顯示行號,可以修改 /etc/vimrc檔案,在最後新增一行 : set nu

    

     7000資料夾下的redis.conf修改完成之後,把其下檔案分別複製到7001~7005資料夾中,並修改redis.conf中對應埠號。依次以後臺方式啟動7000-7005中的快取例項,命令:./7000/redis-server ./7000/redis.conf &

2. 在redis的src目錄下執行建立叢集命令建立叢集

   ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

2.1執行上面的命令的時候會報錯,因為是執行的ruby的指令碼,需要ruby的環境

    錯誤內容:/usr/bin/env: ruby: No such file or directory,

    需要安裝ruby的環境。這裡雙擊cygwin.exe檔案,安裝ruby。可以參考上一篇文章中cygwin中安裝gcc、make

2.2安裝完成ruby後,再執行第6步的建立叢集命令,還會報錯,提示缺少rubygems元件。使用cygwin進行安裝。

2.3再次執行第6步的命令,還會報錯,提示不能載入redis,是因為缺少redis和ruby的介面,使用gem 安裝。在redis的src目錄下執行命令 gem install redis

   

2.4 再次執行叢集建立命令


輸入yes,使用預設的設定


 redis叢集到這裡就搭建完成了。另開一個視窗,輸入 redis-cli -p 7000,然後輸入 cluster nodes,就可以看到叢集的節點資訊。這裡可以看到, 埠為7001、7002、7003的是master,其它的是slave


3. jedis訪問redis叢集

新建maven專案,新增pom依賴

<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.johnfnash.learn</groupId>
  <artifactId>redis-cluster-first</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>redis-cluster-first</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
          <version>2.4.2</version>
    </dependency>
    
    <dependency>
         <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>2.7.3</version>
    </dependency>
    
    <!-- junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

編寫junit測試程式碼

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

import org.junit.Test;

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

public class RedisClusterTest {

	@Test
	public void test() {
		Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
		//只需要新增一個例項,jedis會自動發現叢集中其它節點
		jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
		JedisCluster jc = new JedisCluster(jedisClusterNodes);
		
		String key = "1417";
		jc.setnx(key, "bar");
		String value = jc.get(key);
		System.out.println("key-" + key + " slot-" + JedisClusterCRC16.getSlot(key)
				+ " value-" + value);
		
		String key2 = "288";
		jc.setnx(key2, "bar2");
		String value2 = jc.get(key2);
		System.out.println("key-" + key2 + " slot-" + JedisClusterCRC16.getSlot(key2)
				+ " value-" + value2);
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			if(null != jc) {
				jc.close();
			}
		}
	}

}

執行junit測試用例,結果如下:

接下來用redis客戶端看看這兩個key=1417 、key=288的值存到哪個節點下
看回最初的配置


key=288算出來的 CRC16校驗和是 4258,根據配置 應該存在 7003這臺機上

key=1417 算出來的 CRC16校驗和是 13096,根據配置 應該存在 7002 這臺機上

用redis 客戶端檢視資料存到哪臺機器上


從redis客戶端看到的結果與配置一致