Redis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。它支持存儲(chǔ)多種value類(lèi)型,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類(lèi)型)。這些數(shù)據(jù)類(lèi)型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。同時(shí),為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。Redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。
準(zhǔn)備工作
要讓集群正常工作至少需要3個(gè)主節(jié)點(diǎn),在這里我們要?jiǎng)?chuàng)建6個(gè)redis節(jié)點(diǎn)并部署到2臺(tái)物理節(jié)點(diǎn)上,其中三個(gè)為主節(jié)點(diǎn),三個(gè)為從節(jié)點(diǎn),對(duì)應(yīng)的redis節(jié)點(diǎn)的ip和端口對(duì)應(yīng)關(guān)系如下)
192.168.1.121:7000
192.168.1.121:7001
192.168.1.121:7002
192.168.1.122:7000
192.168.1.122:7001
192.168.1.122:7002
一、安裝Redis
- 下載redis,這里需要下載3.0之后的版本,之前的版本不支持集群模式,本文采用最新的3.0.7版本。(所有節(jié)點(diǎn))
cd /home/soft
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
- 解壓,編譯
編譯前確保安裝好了gcc(所有節(jié)點(diǎn))
tar -zxvf redis-3.0.7.tar.gz
cd /home/soft/redis3.0.7
make
make install
- 創(chuàng)建集群需要的目錄(節(jié)點(diǎn)1)
mkdir -p /home/soft/cluster
cd /home/soft/cluster
mkdir 7000
mkdir 7001
mkdir 7002
- 修改配置文件redis.conf(節(jié)點(diǎn)1)
cp /home/soft/redis3.0.7/redis.conf /home/soft/cluster
vi redis.conf
修改配置文件中的下面選項(xiàng)
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
- 修改完redis.conf配置文件中的這些配置項(xiàng)之后把這個(gè)配置文件分別拷貝到7000/7001/7002目錄下面(節(jié)點(diǎn)1)
cp /home/soft/cluster/redis.conf /home/soft/cluster/7000
cp /home/soft/cluster/redis.conf /home/soft/cluster/7001
cp /home/soft/cluster/redis.conf /home/soft/cluster/7002
注意:拷貝完成之后要修改7001/7002目錄下面redis.conf文件中的port參數(shù),分別改為對(duì)應(yīng)的文件夾的名稱(chēng)。
- 將節(jié)點(diǎn)1上的cluster目錄拷貝到其他節(jié)點(diǎn)上(節(jié)點(diǎn)1)
scp -r /home/soft/cluster root@192.168.1.122:/home/soft/
- 分別啟動(dòng)這6個(gè)redis實(shí)例
//節(jié)點(diǎn)1
cd /home/soft/cluster/7000
redis-server redis.conf
cd /home/soft/cluster/7001
redis-server redis.conf
cd /home/soft/cluster/7002
redis-server redis.conf
//節(jié)點(diǎn)2
cd /home/soft/cluster/7000
redis-server redis.conf
cd /home/soft/cluster/7001
redis-server redis.conf
cd /home/soft/cluster/7002
redis-server redis.conf
- 啟動(dòng)之后使用命令查看redis的啟動(dòng)情況
ps -ef|grep redis
如下圖顯示則說(shuō)明對(duì)應(yīng)節(jié)點(diǎn)的redis實(shí)例啟動(dòng)成功。

二、創(chuàng)建集群
- 安裝ruby環(huán)境
yum -y install ruby
- 安裝rubygems
yum -y install rubygems
- 安裝gem redis
gem install -l redis
- 執(zhí)行redis的創(chuàng)建集群命令創(chuàng)建集群(單節(jié)點(diǎn)即可)
cd /home/soft/redis3.0.7/src
./redis-trib.rb create --replicas 1 192.168.1.121:7000 192.168.1.121:7001 192.168.1.121:7002 192.168.1.122:7000 192.168.1.122:7001 192.168.1.122:7002
--replicas表示為每個(gè)master節(jié)點(diǎn)創(chuàng)建多少個(gè)slave節(jié)點(diǎn)。
創(chuàng)建過(guò)程中,redis-trib 會(huì)打印出一份預(yù)想中的配置給你看, 如果你覺(jué)得沒(méi)問(wèn)題的話(huà), 就可以輸入 yes , redis-trib 就會(huì)將這份配置應(yīng)用到集群當(dāng)中,讓各個(gè)節(jié)點(diǎn)開(kāi)始互相通訊,配置完成。
至此redis集群即搭建成功!
- 使用redis-cli命令進(jìn)入集群環(huán)境
redis-cli -c -p 7000
//或者指定訪問(wèn)ip
redis-cli -c -p 7000 -h 192.168.1.121
簡(jiǎn)單測(cè)試下

從圖中可以看出,它總是依靠 Redis 集群節(jié)點(diǎn)來(lái)將它轉(zhuǎn)向(redirect)至正確的節(jié)點(diǎn)。
三、設(shè)置開(kāi)機(jī)自啟
- 設(shè)置redis.conf中daemonize為yes,確保守護(hù)進(jìn)程開(kāi)啟。
- 編寫(xiě)開(kāi)機(jī)自啟動(dòng)腳本
vi /etc/init.d/redis7000
腳本內(nèi)容如下:
# chkconfig: 2345 10 90
# description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=7000
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF="/home/soft/cluster/7000/redis.conf"
AUTH=""
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed."
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE exists, process is not running."
else
PID=$(cat $PIDFILE)
echo "Stopping..."
$REDIS_CLI -p $REDISPORT SHUTDOWN
sleep 2
while [ -x $PIDFILE ]
do
echo "Waiting for Redis to shutdown..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
編寫(xiě)完成后保存退出。
- 設(shè)置權(quán)限
chmod 755 redis
- 啟動(dòng)
/etc/init.d/redis7000 start
啟動(dòng)成功會(huì)提示如下信息:
Starting Redis server...
Redis is running...
- 設(shè)置開(kāi)機(jī)自啟動(dòng)
chkconfig redis on
- 關(guān)機(jī)重啟測(cè)試
reboot
四、Cluster操作
- 集群
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群當(dāng)前已知的所有節(jié)點(diǎn)(node),以及這些節(jié)點(diǎn)的相關(guān)信息。
- 節(jié)點(diǎn)
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節(jié)點(diǎn)添加到集群當(dāng)中,讓它成為集群的一份子。
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節(jié)點(diǎn)。
CLUSTER REPLICATE <node_id> 將當(dāng)前節(jié)點(diǎn)設(shè)置為 node_id 指定的節(jié)點(diǎn)的從節(jié)點(diǎn)。
CLUSTER SAVECONFIG 將節(jié)點(diǎn)的配置文件保存到硬盤(pán)里面。
- 槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 將一個(gè)或多個(gè)槽(slot)指派(assign)給當(dāng)前節(jié)點(diǎn)。
CLUSTER DELSLOTS <slot> [slot ...] 移除一個(gè)或多個(gè)槽對(duì)當(dāng)前節(jié)點(diǎn)的指派。
CLUSTER FLUSHSLOTS 移除指派給當(dāng)前節(jié)點(diǎn)的所有槽,讓當(dāng)前節(jié)點(diǎn)變成一個(gè)沒(méi)有指派任何槽的節(jié)點(diǎn)。
CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節(jié)點(diǎn),如果槽已經(jīng)指派給另一個(gè)節(jié)點(diǎn),那么先讓另一個(gè)節(jié)點(diǎn)刪除該槽>,然后再進(jìn)行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節(jié)點(diǎn)的槽 slot 遷移到 node_id 指定的節(jié)點(diǎn)中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節(jié)點(diǎn)中導(dǎo)入槽 slot 到本節(jié)點(diǎn)。
CLUSTER SETSLOT <slot> STABLE 取消對(duì)槽 slot 的導(dǎo)入(import)或者遷移(migrate)。
- 鍵
CLUSTER KEYSLOT <key> 計(jì)算鍵 key 應(yīng)該被放置在哪個(gè)槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對(duì)數(shù)量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個(gè) slot 槽中的鍵。
五、客戶(hù)端操作
需要注意的是集群模式目前不支持多數(shù)據(jù)庫(kù)操作,即只能使用database 0,使用select命令會(huì)報(bào)錯(cuò)。
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(2);
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7002));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7002));
// 超時(shí),最大的轉(zhuǎn)發(fā)數(shù),最大鏈接數(shù),最小鏈接數(shù)都會(huì)影響到集群
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 5000, 10, config);
jedisCluster.set("key","value");