windows下使用RedisCluster集群簡單實例

序言

前段時間項目需要把memcache 更換成redis,花了兩天研究了一下redis的集群防泵,網(wǎng)上的資料很多已經(jīng)過期了脱盲,參差不齊,在這里整理了一下做個記錄

一每界、開發(fā)環(huán)境

redis 安裝

    Redis對于Linux是官方支持的,安裝和使用沒有什么好說的,普通使用按照官方指導(dǎo)捅僵,5分鐘以內(nèi)就能搞定。詳情請參考:[http://redis.io/download](http://redis.io/download) 

   Redis官方是不支持windows的眨层,只是 Microsoft Open Tech group 在 GitHub上開發(fā)了一個Win64的版本,官方說明:  

Win64 Unofficial The Redis project does not directly support
Windows, however the Microsoft Open Tech group develops and maintains an Windows port targeting Win64.

 項目地址:https://github.com/MSOpenTech/redis 

打開以后庙楚,可以直接使用瀏覽器下載,或者git克隆趴樱。在release頁面可以下載需要的redis包

Image.png

下載解壓馒闷,沒什么好說的,在解壓后的bin目錄下有以下這些文件:

redis-benchmark.exe #基準(zhǔn)測試
redis-check-aof.exe # aof
redis-check-dump.exe # dump
redis-cli.exe # 客戶端
redis-server.exe # 服務(wù)器
redis.windows.conf # 配置文件

ruby環(huán)境準(zhǔn)備

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

Image.png

安裝RubyGems

下載下來是一個壓縮包叁征,解壓運(yùn)行里面的 setup.rb 安裝 rubyGems
由于墻的原因ruby自帶的源有時候很慢纳账,我們換成淘寶的源,不然下面安裝redis依賴會失斵嗵邸\(--)/

在cmd下運(yùn)行

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

二 疏虫、使用redis cluster

按照文檔的說明步驟來做就行了,詳情在這 http://doc.redisfans.com/topic/cluster-tutorial.html#id5

要讓集群正常運(yùn)作至少需要三個主節(jié)點啤呼,因此我們創(chuàng)建6個節(jié)點卧秘,三個主節(jié)點三個從節(jié)點,詳細(xì)請查看文檔官扣,我簡化一下文檔的步驟即:

1.創(chuàng)建 6個文件夾分別為 7000-7005
這里就是做集群時各個機(jī)器所安裝的redis翅敌,在每個文件夾放一份下載下來的redis,例如

Image.png

2.創(chuàng)建配置文件 redis.conf
其他幾個7000-7004文件夾以此類推惕蹄,注意修改對應(yīng)的端口號

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

文件中的
cluster-enabled 選項用于開實例的集群模式哼御,
cluster-conf-file 選項則設(shè)定了保存節(jié)點配置文件的路徑坯临, 默認(rèn)值為nodes.conf 。
nodes.conf 節(jié)點配置文件無須人為修改恋昼, 它由 Redis 集群在啟動時創(chuàng)建看靠, 并在有需要時自動進(jìn)行更新。

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

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

4.創(chuàng)建集群

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

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

打印出配置信息嗦哆,現(xiàn)在的master是 7000 7001 7002這三臺機(jī)谤祖,redis會對key 做 CRC16 校驗和后分別存儲這三臺機(jī)上。沒問題就輸入 yes

例如 7000 這臺機(jī) slots:0-5460 的意思是:

對key 做 CRC16 校驗和后 值在 0-5460范圍內(nèi)都會存到這臺機(jī)器里
例如 key=288 對應(yīng)的CRC16校驗和 為 4258老速,應(yīng)該存在7000這臺機(jī)里

PS:使用前應(yīng)該對業(yè)務(wù)做梳理粥喜,根據(jù)系統(tǒng)中key的特點來調(diào)整各個機(jī)器的slots范圍,
不然系統(tǒng)的key基本集中在一兩臺機(jī)器上集群的效果就不大了

redis-trib.rb文件在下載下來的redis包里可能是沒有的橘券,可以到
https://github.com/antirez/redis/tree/unstable/src 目錄下下載
之前的ruby環(huán)境就是為運(yùn)行這個文件做準(zhǔn)備的

命令的意義如下:

redis-trib.rb
create额湘, 這表示我們希望創(chuàng)建一個新的集群。
選項 --replicas 1 表示我們希望為集群中的每個主節(jié)點創(chuàng)建一個從節(jié)點旁舰。
之后跟著的其他參數(shù)則是實例的地址列表锋华, 我們希望程序使用這些地址所指示的實例來創(chuàng)建新集群。

簡單來說箭窜, 以上命令的意思就是讓 redis-trib 程序創(chuàng)建一個包含三個主節(jié)點和三個從節(jié)點的集群毯焕。

看看node.conf文件里生成了什么

Paste_Image.png

里面記錄了master 和 slave的對應(yīng)關(guān)系,例如圖片里的 7000是master 而對應(yīng)的 slave是7003這臺機(jī)磺樱,綠色的一長串?dāng)?shù)字是對應(yīng)機(jī)器的Id纳猫,redis以此來標(biāo)記一臺機(jī)器。

三竹捉、Jedis編程使用集群

github地址 https://github.com/xetorthio/jedis
按上面兩步配置好续担,創(chuàng)建并啟動集群。測試代碼如下:

添加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 會自動去發(fā)現(xiàn)集群中的節(jié)點物遇,所以JedisClusterNodes只需要 add一個實例

運(yùn)行得到結(jié)果

Image.png

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


Image.png

key=288算出來的 CRC16校驗和是 4258憾儒,根據(jù)配置 應(yīng)該存在 7000這臺機(jī)上
key=1417 算出來的 CRC16校驗和是 13096询兴,根據(jù)配置 應(yīng)該存在 7002 這臺機(jī)上

用redis 客戶端查看數(shù)據(jù)存到哪臺機(jī)器上

Image.png

進(jìn)去7000這臺機(jī)上
get 288拿到了value bar2
get 1417 得到提示讓去 7002這臺機(jī)查

從redis客戶端看到的結(jié)果與配置一致

四、簡單集成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

參考資料

redis安裝
參考 http://blog.csdn.net/renfufei/article/details/38474435

redis集群
http://doc.redisfans.com/topic/cluster-tutorial.html#id5

redis命令參考
http://doc.redisfans.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市训裆,隨后出現(xiàn)的幾起案子眶根,更是在濱河造成了極大的恐慌蜀铲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属百,死亡現(xiàn)場離奇詭異记劝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)族扰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門厌丑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渔呵,你說我怎么就攤上這事怒竿。” “怎么了扩氢?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵耕驰,是天一觀的道長。 經(jīng)常有香客問我录豺,道長朦肘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任巩检,我火速辦了婚禮厚骗,結(jié)果婚禮上示启,老公的妹妹穿的比我還像新娘兢哭。我一直安慰自己,他們只是感情好夫嗓,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布迟螺。 她就那樣靜靜地躺著,像睡著了一般舍咖。 火紅的嫁衣襯著肌膚如雪矩父。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天排霉,我揣著相機(jī)與錄音窍株,去河邊找鬼。 笑死攻柠,一個胖子當(dāng)著我的面吹牛球订,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑰钮,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冒滩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浪谴?” 一聲冷哼從身側(cè)響起开睡,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤因苹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篇恒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扶檐,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年婚度,在試婚紗的時候發(fā)現(xiàn)自己被綠了蘸秘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝗茁,死狀恐怖醋虏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哮翘,我是刑警寧澤颈嚼,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站饭寺,受9級特大地震影響阻课,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艰匙,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一限煞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧员凝,春花似錦署驻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糖埋,卻和暖如春宣吱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞳别。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工征候, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祟敛。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓疤坝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垒棋。 傳聞我的和親對象是個殘疾皇子卒煞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 。 本文檔是 Red...
    會跳舞的機(jī)器人閱讀 66,930評論 2 21
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)衣撬、高可擴(kuò)展、高可用扮饶、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,291評論 0 36
  • 前言 Redis 是我們目前大規(guī)模使用的緩存中間件具练,由于它強(qiáng)大高效而又便捷的功能,得到了廣泛的使用甜无。單節(jié)點的Red...
    Kevin_ZGJ閱讀 11,681評論 19 133
  • 轉(zhuǎn)自:https://www.zybuluo.com/phper/note/195558 前言 redis 是我們...
    yannhuang閱讀 1,683評論 0 2
  • 遠(yuǎn)也蒼蒼岂丘,近也茵茵陵究,甚似夢中“铝保看翠嶺亙立铜邮,烏江徐繞,朝陽披彩寨蹋,夕照涂彤松蒜。恣意牛羊,任翔鶯鵲已旧,萬類生靈盡自融秸苗。誰營建...
    娜可露露lulu閱讀 924評論 5 3