1. 程式人生 > >windows下使用RedisCluster集群簡單實例

windows下使用RedisCluster集群簡單實例

綠色 nod only vid 準備 信息 sources slots 生成

一、開發環境

ruby環境準備

下載 64位的 RubyInstaller並安裝 地址http://rubyinstaller.org/downloads/
勾選下面三個不用配置環境變量

技術分享
Image.png

安裝RubyGems

下載下來是一個壓縮包,解壓運行裏面的 setup.rb 安裝 rubyGems
由於墻的原因ruby自帶的源有時候很慢,我們換成淘寶的源,不然下面安裝redis依賴會失敗。

在cmd下運行

gem sources --remove https://rubygems.org/ 刪掉原來的源
gem sources -a http://ruby.taobao.org 添加淘寶源
gem sources -l 查看現有的源
gem install redis 安裝redis依賴


二 、使用redis cluster

要讓集群正常運作至少需要三個主節點,因此我們創建6個節點,三個主節點三個從節點,詳細請查看文檔,我簡化一下文檔的步驟即:

1.創建 6個文件夾分別為 7000-7005
這裏就是做集群時各個機器所安裝的redis,在每個文件夾放一份下載下來的redis,例如

技術分享
Image.png

2.創建配置文件 redis.conf
其他幾個7000-7004文件夾以此類推,註意修改對應的端口號

port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

文件中的
cluster-enabled 選項用於開實例的集群模式,
cluster-conf-file 選項則設定了保存節點配置文件的路徑, 默認值為nodes.conf 。
nodes.conf 節點配置文件無須人為修改, 它由 Redis 集群在啟動時創建, 並在有需要時自動進行更新。

3.創建啟動腳本7005.bat
這樣不用總是敲命令 ,名字隨意改,其他幾個文件夾同理

@echo off
redis-server.exe redis.conf
@pause

4.創建集群

  • 1.按照上面所說的配置好各個實例,主要是改端口號,運行 7000.bat- 7005.bat腳本啟動六個redis實例

  • 2.cd到 redis-trib.rb 所在的目錄下運行命令
    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

技術分享
Image.png

打印出配置信息,現在的master是 7000 7001 7002這三臺機,redis會對key 做 CRC16 校驗和後分別存儲這三臺機上。沒問題就輸入 yes

例如 7000 這臺機 slots:0-5460 的意思是:

對key 做 CRC16 校驗和後 值在 0-5460範圍內都會存到這臺機器裏
例如 key=288 對應的CRC16校驗和 為 4258,應該存在7000這臺機裏

註意:使用前應該對業務做梳理,根據系統中key的特點來調整各個機器的slots範圍,
不然系統的key基本集中在一兩臺機器上集群的效果就不大了

redis-trib.rb文件在下載下來的redis包裏可能是沒有的,可以到
https://github.com/antirez/redis/tree/unstable/src 目錄下下載
之前的ruby環境就是為運行這個文件做準備的

命令的意義如下:

redis-trib.rb
create, 這表示我們希望創建一個新的集群。
選項 --replicas 1 表示我們希望為集群中的每個主節點創建一個從節點。
之後跟著的其他參數則是實例的地址列表, 我們希望程序使用這些地址所指示的實例來創建新集群。

簡單來說, 以上命令的意思就是讓 redis-trib 程序創建一個包含三個主節點和三個從節點的集群。

看看node.conf文件裏生成了什麽

技術分享
Paste_Image.png

裏面記錄了master 和 slave的對應關系,例如圖片裏的 7000是master 而對應的 slave是7003這臺機,綠色的一長串數字是對應機器的Id,redis以此來標記一臺機器。

三、Jedis編程使用集群

github地址 https://github.com/xetorthio/jedis
按上面兩步配置好,創建並啟動集群。測試代碼如下:

添加Jedis依賴

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

測試代碼:

@Test
public  void cluster(){
    String key = "1417";
    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
    jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));   
    JedisCluster jc = new JedisCluster(jedisClusterNodes);

    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(key);
    System.out.println("key-"+key2+" slot-"+JedisClusterCRC16.getSlot(key2)+" value-"+value2);
}
技術分享
Image.png

github上有這一句,Jedis Cluster 會自動去發現集群中的節點,所以JedisClusterNodes只需要 add一個實例

運行得到結果

技術分享
Image.png

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

技術分享
Image.png

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

用redis 客戶端查看數據存到哪臺機器上

技術分享
Image.png

進去7000這臺機上
get 288拿到了value bar2
get 1417 得到提示讓去 7002這臺機查

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

四、簡單集成Spring

JedisFactory類
傳入host 、port 和JedisPoolConfig 類

package your path;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

/**
 * <p>Title: JedisClusterFactory.java</p>
 * <p>Description: </p>
 * @author qiaowei liu
 * @date 2016-1-14
 * @version 1.0
 */
public class JedisClusterFactory {

/** 
 * @Description 
 * @author qiaowei liu
 * @date 2016-1-14 上午11:00:18 
 * @param args
 */

private JedisCluster jedisCluster;

public JedisCluster getJedisCluster() {
    return jedisCluster;
}

public JedisClusterFactory(JedisPoolConfig jedisPoolConfig,String host,int port){    
    Set<HostAndPort> jedisClusterNodes= new HashSet<HostAndPort>();
    //Jedis Cluster will attempt to discover cluster nodes automatically
    jedisClusterNodes.add(new HostAndPort(host,port));
    jedisCluster=new JedisCluster(jedisClusterNodes,jedisPoolConfig);
}
}

JedisProvide.java工具類,主要是封裝些常用的操作

package your path;
import your path.CacheSecondLevel;
import redis.clients.jedis.JedisCluster;

/**
 * <p>Title: RedisProvide.java</p>
 * <p>Description: </p>
 * @author qiaowei liu
 * @date 2016-1-8
 * @version 1.0
 */
public class RedisProvide implements CacheSecondLevel {

private JedisCluster jedisCluster;

public RedisProvide(JedisClusterFactory jedisClusterFactory){
       jedisCluster=jedisClusterFactory.getJedisCluster();
}

@Override
public Object get(String key){
    return jedisCluster.get(key);        
}

@Override
public Object[] gets(String[] keys) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void set(String key, Object obj) {
    // TODO Auto-generated method stub
    jedisCluster.set(key, obj.toString());
}

@Override
public void delete(String key) {
    // TODO Auto-generated method stub
    jedisCluster.del(key);
}
}

applicationContext.xml配置

 <!--==================== redis配置 start ====================-->         
 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">    
      <property name="maxTotal"  value="${redis.maxTotal}" /> 
    <property name="maxIdle" value="${redis.maxIdle}" /> 
     <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
    <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
    <property name="testOnBorrow" value="${redis.testOnBorrow}" />
 </bean>

 <bean id="jedisClusterFactory" class="xxx.xxx.JedisClusterFactory" > 
    <constructor-arg  ref ="jedisPoolConfig"/>
    <constructor-arg  name="host" value="${redis.host}"/>
    <constructor-arg  name="port" value="${redis.port}"/>           
 </bean>

 <bean id="redisProvide" class="xxx.xxx.RedisProvide">
    <constructor-arg  ref ="jedisClusterFactory" />
 </bean>
<!--==================== redis配置 end ====================-->

conf/perproties

#redis config
redis.host=127.0.0.1
redis.port=7000
redis.timeout=100000
redis.maxIdle=300
redis.maxTotal=600 
redis.timeBetweenEvictionRunsMillis=30000  
redis.minEvictableIdleTimeMillis=30000 
redis.testOnBorrow=true



windows下使用RedisCluster集群簡單實例