原文地址:http://www.jianshu.com/p/22af55518f6d
一、開發環境
1、win7
2、redis 3.0 64位
3、ruby環境
二、相關安裝
1、redis安裝
參考:http://blog.csdn.net/littleskey/article/details/52241904
2、ruby環境準備
下載 64位的 RubyInstaller並安裝 地址http://rubyinstaller.org/downloads/勾選下面三個不用配置環境變量
3、RubyGems安裝
下載下來是一個壓縮包,解壓運行裏面的 setup.rb 安裝 rubyGems
(原文說ruby的源很慢,換成淘寶的源。本文實現時,淘寶的源已不可用,在此不更換源。如需更換,請查看原文)
4、下載redis-trib.rb
參照上文下載下來的redis包,沒有該文件。到https://github.com/antirez/redis/tree/unstable/src 目錄下下載。之前的ruby環境就是爲運行這個文件做準備的。
三、Redis相關配置
文檔說明:http://doc.redisfans.com/topic/cluster-tutorial.html#id5
要讓集羣正常運作至少需要三個主節點, 不過在剛開始試用集羣功能時, 強烈建議使用六個節點: 其中三個爲主節點, 而其餘三個則是各個主節點的從節點。
1、創建節點
創建六個文件夾,每個文件夾複製一份下載的Redis包。如:
2、修改redis.window.conf文件
(1)修改各個文件對應的端口號。如:
修改redis-lates1中redis.window.conf的port爲7000
修改redis-lates2中redis.window.conf的port爲7001
依次類推。
(2)公共部分
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
3、創建啓動腳本startRedis.bat
這樣不用總是敲命令,其他幾個文件夾同理
4、啓動集羣
(1)啓動上面所說各個redis實例
(2)到redis-trib.rb(沒有參考二 4、下載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
redis-trib.rb
create, 這表示我們希望創建一個新的集羣。
選項 --replicas 1 表示我們希望爲集羣中的每個主節點創建一個從節點。
之後跟着的其他參數則是實例的地址列表, 我們希望程序使用這些地址所指示的實例來創建新集羣
(replicas 後爲1不爲小寫L)
以上命令的意思就是讓 redis-trib 程序創建一個包含三個主節點和三個從節點的集羣。
(3)執行結果
打印出配置信息,現在的master是 7000 7001 7002這三臺機,redis會對key 做 CRC16 校驗和後分別存儲這三臺機上。沒問題就輸入 yes(上例未輸入yes,程序中止)
例如 7000 這臺機 slots:0-5460 的意思是:
對key 做 CRC16 校驗和後 值在 0-5460範圍內都會存到這臺機器裏。例如 key=288 對應的CRC16校驗和 爲 4258,應該存在7000這臺機裏
四、Jedis編程使用集羣
package com.learn.redis;
import java.util.HashSet;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
public class RedisClusterTest {
private JedisCluster jc;
@Before
public void init()
{
Set<HostAndPort> nodes = new HashSet<>();
//Jedis Cluster會自動發現集羣中的節點
nodes.add(new HostAndPort("127.0.0.1", 7000));
jc = new JedisCluster(nodes);
}
@Test
public void test()
{
jc.set("foo","bar");
System.out.println(jc.get("foo"));
}
}