Redis 分片集群的實(shí)現(xiàn)
1 搭建分片集群
主從和哨兵可以解決高可用、高并發(fā)讀的問(wèn)題。但是依然有兩個(gè)問(wèn)題沒(méi)有解決:
- 海量數(shù)據(jù)存儲(chǔ)問(wèn)題,單個(gè)Redis節(jié)點(diǎn)對(duì)于數(shù)據(jù)的存儲(chǔ)量是有上限的
- 高并發(fā)寫(xiě)的問(wèn)題,高并發(fā)讀的問(wèn)題我們可以用主從集群來(lái)解決,那高并發(fā)寫(xiě)的問(wèn)題又該怎樣解決呢
針對(duì)上述問(wèn)題,我們可以搭建Redis的分片集群,如圖所示:

Redis的分片集群具有以下特征:
- 集群中有多個(gè)master,每個(gè)master保存不同數(shù)據(jù)
- 每個(gè)master都可以有多個(gè)slave節(jié)點(diǎn)
- master之間通過(guò)ping監(jiān)測(cè)彼此健康狀態(tài)(可以取代哨兵機(jī)制)
- 客戶(hù)端請(qǐng)求可以訪(fǎng)問(wèn)集群任意節(jié)點(diǎn),最終都會(huì)被轉(zhuǎn)發(fā)到正確節(jié)點(diǎn)
接下來(lái)我們可以動(dòng)手來(lái)搭建一個(gè)Redis分片集群
1.1 集群結(jié)構(gòu)
分片集群需要的節(jié)點(diǎn)數(shù)量較多,這里我們搭建一個(gè)最小的分片集群,包含3個(gè)master節(jié)點(diǎn),每個(gè)master包含一個(gè)slave節(jié)點(diǎn),結(jié)構(gòu)如下:

這里我們會(huì)在同一臺(tái)虛擬機(jī)中開(kāi)啟6個(gè)redis實(shí)例,模擬分片集群,信息如下:
| IP | PORT | 角色 |
|---|---|---|
| 192.168.211.100 | 7001 | master |
| 192.168.211.100 | 7002 | master |
| 192.168.211.100 | 7003 | master |
| 192.168.211.100 | 8001 | slave |
| 192.168.211.100 | 8002 | slave |
| 192.168.211.100 | 8003 | slave |
1.2 準(zhǔn)備實(shí)例和配置
這里我的redis安裝目錄為/usr/local/redis-6.2.6,以下操作將以此目錄進(jìn)行參考,額外需要注意的是,以下操作都是在redis沒(méi)有設(shè)置密碼的情況下進(jìn)行的,如果你的redis設(shè)置了密碼,那么按照以下步驟進(jìn)行就會(huì)出問(wèn)題。
1)創(chuàng)建出7001、7002、7003、8001、8002、8003目錄
# 進(jìn)入/local目錄 cd /usr/local # 創(chuàng)建目錄 mkdir 7001 7002 7003 8001 8002 8003
2)在/usr/local下準(zhǔn)備一個(gè)新的redis.conf文件,內(nèi)容如下:
port 6379 # 開(kāi)啟集群功能 cluster-enabled yes # 集群的配置文件名稱(chēng),不需要我們創(chuàng)建,由redis自己維護(hù) cluster-config-file /usr/local/6379/nodes.conf # 節(jié)點(diǎn)心跳失敗的超時(shí)時(shí)間 cluster-node-timeout 5000 # 持久化文件存放目錄 dir /usr/local/6379 # 綁定地址 bind 0.0.0.0 # 讓redis后臺(tái)運(yùn)行 daemonize yes # 注冊(cè)的實(shí)例ip replica-announce-ip 192.168.211.100 # 保護(hù)模式 protected-mode no # 數(shù)據(jù)庫(kù)數(shù)量 databases 1 # 日志 logfile /usr/local/6379/run.log
3)將這個(gè)文件拷貝到每個(gè)目錄下:
# 進(jìn)入/local目錄 cd /usr/local # 執(zhí)行拷貝 echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
4)修改每個(gè)目錄下的redis.conf,將其中的6379修改為與所在目錄一致:
# 進(jìn)入/local目錄
cd /usr/local
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
1.3 啟動(dòng)
因?yàn)橐呀?jīng)配置了后臺(tái)啟動(dòng)模式,所以可以直接啟動(dòng)服務(wù):
# 進(jìn)入/usr/local目錄
cd /usr/local
# 一鍵啟動(dòng)所有服務(wù)
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf
通過(guò)ps查看狀態(tài):
ps -ef | grep redis
發(fā)現(xiàn)服務(wù)都已經(jīng)正常啟動(dòng):

如果要關(guān)閉所有進(jìn)程,可以執(zhí)行命令:
ps -ef | grep redis | awk '{print $2}' | xargs kill或者(推薦這種方式):
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->} -t redis-cli -p {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->} shutdown1.4 創(chuàng)建集群
雖然服務(wù)啟動(dòng)了,但是目前每個(gè)服務(wù)之間都是獨(dú)立的,沒(méi)有任何關(guān)聯(lián)。我們需要執(zhí)行以下命令來(lái)創(chuàng)建集群,注意,以下命令需要你的redis版本在5.0之后:
redis-cli --cluster create --cluster-replicas 1 192.168.211.100:7001 192.168.211.100:7002 192.168.211.100:7003 192.168.211.100:8001 192.168.211.100:8002 192.168.211.100:8003
命令說(shuō)明:
redis-cli --cluster:代表集群操作命令create:代表創(chuàng)建集群--cluster-replicas 1:指定集群中每個(gè)master的副本個(gè)數(shù)為1,也就是說(shuō)一個(gè)master只有一個(gè)slave,此時(shí)節(jié)點(diǎn)總數(shù) ÷ (replicas + 1)得到的就是master的數(shù)量。因此節(jié)點(diǎn)列表中的前n個(gè)就是master,其它節(jié)點(diǎn)都是slave節(jié)點(diǎn),在創(chuàng)建集群時(shí)這些slave會(huì)被隨機(jī)分配給不同master
執(zhí)行上述命令之后,控制臺(tái)會(huì)列出當(dāng)前主從節(jié)點(diǎn)分配的結(jié)果,即將那些slave分別分配給哪些master,并詢(xún)問(wèn)你是否同意,這里我們輸入'yes'即可

確定之后,集群開(kāi)始創(chuàng)建

通過(guò)命令可以查看集群狀態(tài):
redis-cli -p 7001 cluster nodes

1.5 測(cè)試
集群操作時(shí),需要在redis-cli連接時(shí)帶上-c參數(shù)才可以
redis-cli -p 7001
通過(guò)觀(guān)察上述從節(jié)點(diǎn)的狀態(tài),我們發(fā)現(xiàn)7001的slave是8001,我們可以嘗試在7001里插入一個(gè)數(shù)字,再?gòu)?001里獲取

事實(shí)上,我們不僅可以從8001里獲取到num,也可以從其他slave甚至其他master里獲取到num:

而且我們發(fā)現(xiàn),當(dāng)我們?cè)噲D從其他節(jié)點(diǎn)獲取num時(shí),最后都會(huì)跳轉(zhuǎn)到7001,為什么會(huì)這樣呢?這就涉及到我們即將講解的插槽原理
2 散列插槽
一個(gè)Redis分片集群有0~16383共16384個(gè)插槽(hash slot),這些插槽會(huì)被平均分給每一個(gè)master節(jié)點(diǎn),一個(gè)master節(jié)點(diǎn)映射著一部分插槽,這一點(diǎn)在集群創(chuàng)建時(shí)的信息中可以看到

在分片集群中,數(shù)據(jù)key并不是與某個(gè)節(jié)點(diǎn)綁定,而是與插槽綁定。數(shù)據(jù)key與插槽是多對(duì)一的關(guān)系,redis會(huì)根據(jù)key的有效部分計(jì)算插槽值,然后將key放入對(duì)應(yīng)插槽,key的有效部分分兩種情況:
- 當(dāng)key中包含"{}“時(shí),且”{}“中至少包含1個(gè)字符,”{}"中的部分是有效部分
- key中不包含"{}",整個(gè)key都是有效部分
舉個(gè)例子,假如key是num,那么插槽值就會(huì)根據(jù)num來(lái)計(jì)算,如果key是{itheima}num,那么插槽值就會(huì)根據(jù)itheima來(lái)計(jì)算。計(jì)算方式是利用CRC16算法得到一個(gè)hash值,然后對(duì)16384取余,得到的結(jié)果就是slot值。
如果當(dāng)前操作的key所在的插槽不屬于本節(jié)點(diǎn),則會(huì)發(fā)生重定向,重定向的目標(biāo)是該插槽所屬的節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)一定是master,如果我們連接的節(jié)點(diǎn)為slave,則會(huì)直接進(jìn)行重定向,因?yàn)閟lave是沒(méi)有插槽的。
針對(duì)上述幾點(diǎn),演示如下:

如上圖所示,我們連接了7001,并試圖插入數(shù)據(jù)k1,這時(shí)redis需要去判斷k1所屬的插槽位置,由于key中不包含’{}',因此整個(gè)key都是有效部分,redis會(huì)對(duì)k1做hash運(yùn)算然后對(duì)16384取余,得到的結(jié)果是12706,這也就是k1所在的插槽的位置,在當(dāng)前集群中,映射該插槽的節(jié)點(diǎn)是7003,此時(shí)就會(huì)發(fā)生重定向,我們也可以觀(guān)察到當(dāng)我們執(zhí)行完set k1 1命令之后,操作的端口已經(jīng)變成了7003。此時(shí)我們繼續(xù)在7003端口中進(jìn)行操作,比如修改數(shù)據(jù)num的值,而num所在的插槽是2765,在當(dāng)前集群中,映射該插槽的節(jié)點(diǎn)是7001,因此當(dāng)我們執(zhí)行完set num 2命令之后,操作的端口又重新變成了7001
那么接下來(lái)讓我們思考兩個(gè)問(wèn)題:
為什么數(shù)據(jù)key要與插槽綁定,而不是與節(jié)點(diǎn)綁定呢?
這是因?yàn)镽edis的主節(jié)點(diǎn)有可能會(huì)出現(xiàn)宕機(jī)情況,也有可能由于集群伸縮而被刪除,當(dāng)節(jié)點(diǎn)刪除或者發(fā)生宕機(jī)時(shí),節(jié)點(diǎn)上保存的數(shù)據(jù)也就丟失了,但如果數(shù)據(jù)綁定的是插槽而不是節(jié)點(diǎn),那么當(dāng)出現(xiàn)上述情況時(shí),就可以將故障節(jié)點(diǎn)的插槽轉(zhuǎn)移至存活節(jié)點(diǎn)上。這樣,數(shù)據(jù)跟插槽綁定,就永遠(yuǎn)都能夠找到數(shù)據(jù)所在位置。
如何將同一類(lèi)數(shù)據(jù)固定的保存在一個(gè)插槽中
在業(yè)務(wù)開(kāi)發(fā)中,同一類(lèi)型的數(shù)據(jù)key最好是保存在一個(gè)插槽中,因?yàn)槿绻稚⒈4?,在我們調(diào)用的時(shí)候就很可能出現(xiàn)重定向的情況,重定向是會(huì)消耗一部分性能的。如果我們希望將同一類(lèi)型的數(shù)據(jù)key最好是保存在一個(gè)插槽中,可以為這些key帶上一個(gè)用’{}'包裹的固定前綴,比如{user}zs、{user}ls等等,因?yàn)槲覀冎罢f(shuō)過(guò),當(dāng)key中包含"{}“,且”{}“中至少包含1個(gè)字符時(shí),”{}"中的部分是有效部分,redis會(huì)根據(jù)這一部分來(lái)計(jì)算插槽值,如果我們將同一類(lèi)型的key都加上這類(lèi)前綴,就能保證這些key在同一個(gè)插槽中了
3 集群伸縮
集群已經(jīng)創(chuàng)建了,那么如果我們想在集群中添加節(jié)點(diǎn)或刪除節(jié)點(diǎn),又應(yīng)該怎么做呢?
redis-cli --cluster提供了很多操作集群的命令,可以通過(guò)下面方式查看:

其中就包括添加節(jié)點(diǎn)的命令:

假設(shè)現(xiàn)在有以下需求:向集群中添加一個(gè)新的master節(jié)點(diǎn)7004,并在這個(gè)節(jié)點(diǎn)中存儲(chǔ) num = 10,執(zhí)行步驟如下:
3.1 創(chuàng)建節(jié)點(diǎn)并添加到集群
1)在/usr/local目錄下創(chuàng)建一個(gè)文件夾:
cd /usr/local mkdir 7004
2)拷貝配置文件:
cp redis.conf 7004
3)修改配置文件:
printf '%s\n' 7004 | xargs -I{<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->} -t sed -i 's/6379/{}/g' {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->}/redis.conf4)啟動(dòng)
redis-server 7004/redis.conf
接下來(lái)就需要將7004添加到集群中了,在執(zhí)行添加操作之前,我們先來(lái)了解以下添加節(jié)點(diǎn)的命令

添加節(jié)點(diǎn)首先需要以下幾個(gè)參數(shù):
new_host:new_port:指定新添加的節(jié)點(diǎn)的ip地址與端口號(hào),這個(gè)沒(méi)什么好說(shuō)的existing_host:existing_port:任意指定一個(gè)集群中已經(jīng)存在的節(jié)點(diǎn)的ip地址與端口號(hào)。因?yàn)榧褐屑尤胄鹿?jié)點(diǎn)是需要通知其他舊節(jié)點(diǎn)的,新節(jié)點(diǎn)只需要將自己的信息提供給集群中任意一個(gè)節(jié)點(diǎn),那么整個(gè)集群就都能知道關(guān)于新節(jié)點(diǎn)的信息了cluster-slave:可選項(xiàng),不指定則表示該節(jié)點(diǎn)是master,如果指定了則表示該節(jié)點(diǎn)是一個(gè)slavecluster-master-id <arg>:如果我們指定了cluster-slave,那么就需要通過(guò)該參數(shù)指定該節(jié)點(diǎn)的master的id
了解了該命令之后,接下來(lái)我們來(lái)執(zhí)行添加節(jié)點(diǎn)操作:
執(zhí)行命令:
redis-cli --cluster add-node 192.168.211.100:7004 192.168.211.100:7001
通過(guò)命令查看集群狀態(tài):
redis-cli -p 7001 cluster nodes
如圖,7004加入了集群,并且默認(rèn)是一個(gè)master節(jié)點(diǎn):

但是,我們也可以看到7004是沒(méi)有插槽的,因?yàn)椴宀垡呀?jīng)被其他master瓜分完畢了,因此沒(méi)有任何數(shù)據(jù)可以存儲(chǔ)到7004上,這時(shí)候我們就需要進(jìn)行插槽的轉(zhuǎn)移,即將其他matser的插槽分出一部分給7004
3.2 轉(zhuǎn)移插槽
首先回歸需求本身,我們的需求是將num=10存儲(chǔ)在7004節(jié)點(diǎn)上,那么我們的目的就很明顯了,首先需要知道num存儲(chǔ)在哪個(gè)插槽上,然后將這個(gè)插槽轉(zhuǎn)移到7004上即可

如上圖所示,num的插槽為2765,該插槽目前是保存在7001上的,因此我們可以將0~3000的插槽從7001轉(zhuǎn)移到7004,轉(zhuǎn)移插槽的命令格式如下:

具體步驟如下:
1)輸入轉(zhuǎn)移插槽命令,這里我們需要轉(zhuǎn)移的插槽在7001上,因此需要指定7001的地址
redis-cli --cluster reshard 192.168.211.100:7001
2)系統(tǒng)會(huì)詢(xún)問(wèn)我們要移動(dòng)多少個(gè)插槽,這里我們輸入3000即可

3)系統(tǒng)接著詢(xún)問(wèn)我們需要讓哪個(gè)節(jié)點(diǎn)來(lái)接收插槽,這里我們需要輸入7004的ID

4)接著系統(tǒng)會(huì)詢(xún)問(wèn)我們要從哪些節(jié)點(diǎn)中移動(dòng)這些插槽到7004

這里我們有三個(gè)選擇:
- all:代表全部,也就是三個(gè)節(jié)點(diǎn)各轉(zhuǎn)移一部分
- 具體的id:目標(biāo)節(jié)點(diǎn)的id
- done:表示結(jié)束
這里我們需要從7001中獲取插槽,因此填寫(xiě)7001的id,然后輸入done表示結(jié)束

5)接下來(lái)會(huì)冒出一大串東西,并詢(xún)問(wèn)我們是否確定要移動(dòng)這些插槽,這里我們直接輸入yes即可

輸入yes之后,等待控制臺(tái)打印結(jié)束,插槽也就移動(dòng)完畢了
6) 輸入以下命令查看插槽是否已經(jīng)移動(dòng)到7004
redis-cli -p 7001 cluster nodes
很顯然,我們的目的已經(jīng)達(dá)成了

那么如果我們要?jiǎng)h除7004節(jié)點(diǎn),又應(yīng)該怎樣做呢?這里筆者只給去具體思路,大家可以自行嘗試一下:
- 先將 7004 分配的插槽轉(zhuǎn)移至其他節(jié)點(diǎn)
- 執(zhí)行刪除節(jié)點(diǎn)命令
redis-cli --cluster del-node host:port node_id - 通過(guò)命令查詢(xún)結(jié)果
redis-cli -p 7001 cluster nodes
4 故障轉(zhuǎn)移
之前我們提到過(guò),redis分片集群可以通過(guò)master之間的心跳監(jiān)測(cè)來(lái)監(jiān)測(cè)彼此之間的健康狀態(tài),從而取代哨兵。而我們也知道,哨兵的作用就是監(jiān)測(cè)master和slave的狀態(tài),當(dāng)認(rèn)為一個(gè)master客觀(guān)下線(xiàn)后,會(huì)從slave中選舉出一個(gè)新的master,現(xiàn)在讓我們來(lái)驗(yàn)證一下redis分片集群是否具備這個(gè)功能。
首先集群的初始狀態(tài)是這樣的,如果狀態(tài)為connected則表示節(jié)點(diǎn)正常連接

其中7001、7002、7003、7004都是master,我們計(jì)劃讓7002宕機(jī)。
4.1.自動(dòng)故障轉(zhuǎn)移
當(dāng)集群中有一個(gè)master宕機(jī)會(huì)發(fā)生什么呢?我們可以直接停止一個(gè)redis實(shí)例,例如7002:
redis-cli -p 7002 shutdown
1)首先是該實(shí)例與其它實(shí)例失去連接
2)然后是疑似宕機(jī),7002的狀態(tài)變成了disconnected

3)最后是確定下線(xiàn),將7002的一個(gè)slave提升為新的master,這里由于7002只有一個(gè)slave,即8002,因此8002被選為了新的master

4)接下來(lái)我們通過(guò)以下命令再次啟動(dòng)7002節(jié)點(diǎn)
redis-server /usr/local/7002/redis.conf
當(dāng)7002再次啟動(dòng)之后,它就已經(jīng)變?yōu)橐粋€(gè)slave節(jié)點(diǎn)了

上面這種叫自動(dòng)故障轉(zhuǎn)移,但有的時(shí)候我們可能需要做手動(dòng)故障轉(zhuǎn)移,比如當(dāng)某臺(tái)master機(jī)器比較老舊,需要升級(jí)時(shí),我們就可以在這個(gè)集群中新增一個(gè)節(jié)點(diǎn),讓這個(gè)節(jié)點(diǎn)成為取代原來(lái)的master成為新的master,這樣原來(lái)的master就會(huì)變成新master的一個(gè)slave,從而實(shí)現(xiàn)機(jī)器的無(wú)感知升級(jí)
4.2 手動(dòng)故障轉(zhuǎn)移
我們可以在slave節(jié)點(diǎn)中使用cluster failover命令,這個(gè)命令會(huì)讓當(dāng)前slave節(jié)點(diǎn)的master暫時(shí)宕機(jī),宕機(jī)期間會(huì)將自身的數(shù)據(jù)轉(zhuǎn)移給執(zhí)行命令的slave節(jié)點(diǎn),宕機(jī)結(jié)束后,之前的master會(huì)變成slave,而執(zhí)行命令的slave會(huì)變成新的master。
其詳細(xì)流程如下:

當(dāng)slave執(zhí)行了cluster failover命令之后,就會(huì)向master節(jié)點(diǎn)發(fā)送節(jié)點(diǎn)替換通知,為了避免數(shù)據(jù)的丟失,master接收到slave節(jié)點(diǎn)發(fā)送過(guò)來(lái)的通知后,就會(huì)暫時(shí)拒絕來(lái)自客戶(hù)端的任何數(shù)據(jù)讀寫(xiě)請(qǐng)求。然后,master會(huì)將自己當(dāng)前的offset返回給slave,slave接收到后會(huì)判斷自身數(shù)據(jù)中的offset與master的offset是否一致,如果不一致,則需要進(jìn)行數(shù)據(jù)同步。由于 master 已經(jīng)拒絕了客戶(hù)端的所有請(qǐng)求,那么一旦 slave完成數(shù)據(jù)同步,也就表示slave與master之間數(shù)據(jù)是完全一致的。
數(shù)據(jù)同步結(jié)束之后,就會(huì)開(kāi)始進(jìn)行故障轉(zhuǎn)移,讓slave與master 進(jìn)行角色互換,該slave成為新的master,而舊的master則轉(zhuǎn)變?yōu)橐粋€(gè)新的slave。轉(zhuǎn)移結(jié)束后,slave便會(huì)標(biāo)記自己為master,并向集群中每一個(gè)節(jié)點(diǎn)廣播故障轉(zhuǎn)移的結(jié)果。當(dāng)集群中節(jié)點(diǎn)收到廣播后,后續(xù)的所有交互便轉(zhuǎn)移至新的master。
這種failover命令可以指定三種模式:
缺省:默認(rèn)的流程,如圖1~6歩,一般我們會(huì)選擇這個(gè)force:省略了對(duì)offset的一致性校驗(yàn),直接開(kāi)始故障轉(zhuǎn)移takeover:直接執(zhí)行第5歩,忽略數(shù)據(jù)一致性、忽略master狀態(tài)和其它master的意見(jiàn)
接下來(lái)我們可以嘗試一下,在7002這個(gè)slave節(jié)點(diǎn)上執(zhí)行手動(dòng)故障轉(zhuǎn)移,讓它重新奪回master地位,步驟如下:
1)利用redis-cli連接7002,并執(zhí)行cluster failover命令

2)通過(guò)redis-cli -p 7001 cluster nodes命令查看節(jié)點(diǎn)狀態(tài)

5 RedisTemplate訪(fǎng)問(wèn)分片集群
我們只需要通過(guò)以下簡(jiǎn)單的配置,就可以通過(guò)Java代碼訪(fǎng)問(wèn)我們之前部署好的分片集群
1)在boot項(xiàng)目的pom文件中導(dǎo)入依賴(lài)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2)在application.yml中指定sentinel相關(guān)信息:
spring:
redis:
cluster:
nodes: #指定分片集群中每一個(gè)節(jié)點(diǎn)信息
- 192.168.150.101:7001
- 192.168.150.101:7002
- 192.168.150.101:7003
- 192.168.150.101:8001
- 192.168.150.101:8002
- 192.168.150.101:8003
3)在項(xiàng)目的啟動(dòng)類(lèi)中,添加一個(gè)新的bean,這個(gè)bean是用來(lái)做Redis集群的讀寫(xiě)分離的
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
bean中配置的信息是讀寫(xiě)策略,包括四種可選項(xiàng):
- MASTER:從master讀取
- MASTER_PREFERRED:優(yōu)先從master節(jié)點(diǎn)讀取,master不可用才讀取slave
- REPLICA:從slave節(jié)點(diǎn)讀取
- REPLICA _PREFERRED:優(yōu)先從slave節(jié)點(diǎn)讀取,所有的slave都不可用才讀取master
上述配置完畢之后,我們就可以正常使用RedisTemplate來(lái)對(duì)redis集群進(jìn)行操作,如果集群中某個(gè)的master宕機(jī)了,集群就會(huì)自動(dòng)選舉新的master,并將新master的信息發(fā)送給該Java程序,這樣Java程序就可以對(duì)新master進(jìn)行寫(xiě)操作而對(duì)其他節(jié)點(diǎn)進(jìn)行讀操作了。而這一過(guò)程都是自動(dòng)完成的,無(wú)需我們過(guò)多關(guān)注
到此這篇關(guān)于Redis 分片集群的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis 分片集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis動(dòng)態(tài)熱點(diǎn)數(shù)據(jù)緩存策略設(shè)計(jì)
本文主要介紹了Redis動(dòng)態(tài)熱點(diǎn)數(shù)據(jù)緩存策略設(shè)計(jì),包括熱點(diǎn)數(shù)據(jù)識(shí)別、動(dòng)態(tài)緩存、多級(jí)緩存、預(yù)加載機(jī)制、更新策略以及監(jiān)控告警等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
淺析PHP分布式中Redis實(shí)現(xiàn)Session的方法
這篇文章主要介紹了PHP分布式中Redis實(shí)現(xiàn)Session的方法,文中詳細(xì)介紹了兩種方法的使用方法,并給出了測(cè)試的示例代碼,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧,2016-12-12
MyBatis緩存和二級(jí)緩存整合Redis的解決方案
這篇文章主要介紹了MyBatis緩存和二級(jí)緩存整合Redis,將MyBatis緩存和二級(jí)緩存整合Redis,可以提高查詢(xún)效率,同時(shí)也能保證數(shù)據(jù)的可靠性和一致性,需要的朋友可以參考下2023-07-07
redis如何設(shè)置database個(gè)數(shù)
這篇文章主要介紹了redis如何設(shè)置database個(gè)數(shù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
redis中使用bloomfilter的白名單功能解決緩存穿透問(wèn)題
本文主要介紹了redis中使用bloomfilter的白名單功能解決緩存穿透問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Redis分布式鎖與Redlock算法實(shí)現(xiàn)
在Redis中,可以使用多種方式實(shí)現(xiàn)分布式鎖,如使用SETNX命令或RedLock算法,本文就來(lái)介紹一下Redis分布式鎖與Redlock算法實(shí)現(xiàn),感興趣的可以了解一下2023-12-12

