windows下使用RedisCluster集群簡單實例
一、開發環境
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集群簡單實例