新聞中心
探索Redis中KEY槽特性的深入查看

Redis作為一個(gè)全內(nèi)存型的鍵值對(duì)存儲(chǔ),采用了哈希表作為底層數(shù)據(jù)結(jié)構(gòu)。當(dāng)用戶往Redis中存儲(chǔ)數(shù)據(jù)時(shí),Redis會(huì)將鍵值對(duì)通過(guò)哈希函數(shù)映射為一個(gè)哈希值,然后再將這個(gè)哈希值映射到哈希表的一個(gè)槽(bucket)中。但是,對(duì)于大多數(shù)用戶來(lái)說(shuō),對(duì)Redis中的key槽并不是那么了解,因此本文旨在對(duì)Redis中的key槽進(jìn)行深入探討。
Redis中的key槽
首先我們來(lái)看看Redis中的key槽究竟是什么。在Redis中,每個(gè)哈希表包含2^14個(gè)槽,每一個(gè)key都會(huì)被Redis自動(dòng)映射到這個(gè)槽中。而且,這個(gè)映射是根據(jù)key的哈希值模2^14來(lái)確定的,因此如果兩個(gè)key的哈希值模2^14的值相同,那么這兩個(gè)key就會(huì)被映射到同一個(gè)槽中。
例如,我們可以通過(guò)命令”cluster slots”來(lái)獲取當(dāng)前Redis集群的槽數(shù)目(默認(rèn)為16384):
127.0.0.1:6379> cluster slots
1) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 6379
3) "-"
4) 1) (integer) 5461
2) (integer) 10922
3) "127.0.0.1"
5) 1) (integer) 10923
2) (integer) 16383
3) "127.0.0.1"
這個(gè)命令的輸出中,2^14的值為16384,因此可以看到當(dāng)前集群中有16384個(gè)槽。我們可以將這些槽看作一個(gè)大的哈希表,每個(gè)key都映射到這個(gè)哈希表上的一個(gè)槽中。
Redis中的槽分配
每個(gè)Redis節(jié)點(diǎn)都會(huì)根據(jù)一定的規(guī)則,將自己所負(fù)責(zé)的槽均勻地分配到集群中。這個(gè)規(guī)則是由Redis的集群管理器(Cluster Manager)來(lái)執(zhí)行的,它會(huì)監(jiān)視集群中的所有節(jié)點(diǎn),并在必要時(shí)移動(dòng)槽到不同的節(jié)點(diǎn)上,來(lái)保持集群的高可用性和負(fù)載均衡性。
我們可以通過(guò)命令”cluster nodes”來(lái)查看當(dāng)前集群中的所有節(jié)點(diǎn)及其負(fù)責(zé)的槽:
127.0.0.1:6379> cluster nodes
e15c33be21515035f780b1cf17c7cd96dc4f9e9f 127.0.0.1:6379@16379 myself,master - 0 0 2 connected 5461-10922
38bd833b6d9f6db52d6e1296973baa3aef52762d 127.0.0.1:6380@16380 slave 50e14888c1027ecf54122d233c4816d289914e8b 0 0 4 connected
d4d4ae8c74e2eab940aca36c7a08479f5c5da1bb 127.0.0.1:6381@16381 slave e15c33be21515035f780b1cf17c7cd96dc4f9e9f 0 0 3 connected
50e14888c1027ecf54122d233c4816d289914e8b 127.0.0.1:6382@16382 master - 0 1653891967622 1 connected 0-5460,10923-16383
這個(gè)命令的輸出中,每個(gè)節(jié)點(diǎn)的信息包括節(jié)點(diǎn)ID、節(jié)點(diǎn)IP和端口、節(jié)點(diǎn)類型(主節(jié)點(diǎn)或從節(jié)點(diǎn))、節(jié)點(diǎn)狀態(tài)、節(jié)點(diǎn)負(fù)責(zé)的槽數(shù)量和范圍等信息。由此可以看出,在這個(gè)集群中,節(jié)點(diǎn)”127.0.0.1:6382@16382″負(fù)責(zé)槽0到5460和10923到16383,其它節(jié)點(diǎn)則負(fù)責(zé)其中的一部分槽。
Redis中槽的遷移
當(dāng)集群中的某個(gè)節(jié)點(diǎn)需要加入或退出時(shí),Redis會(huì)自動(dòng)地將將該節(jié)點(diǎn)負(fù)責(zé)的槽移動(dòng)到其它節(jié)點(diǎn)上,以保持集群的均衡性。例如,下面的命令可以將槽0-5460從節(jié)點(diǎn)”127.0.0.1:6382@16382″移動(dòng)到節(jié)點(diǎn)”127.0.0.1:6379@16379″上:
127.0.0.1:6379> cluster reshard 3e847649a037809619eccb2dfa2f6b7852f387ac #source節(jié)點(diǎn)的ID
How many slots do you want to move (from 1 to 16384)? 5461
What is the receiving node ID? 4d172621eeeb51ce7b5201cf44f3187d69ebfcba #目標(biāo)節(jié)點(diǎn)的ID
Please enter all the source and destination node IDs.
Type 'all' to use all the nodes as source nodes.
Type 'done' once you entered all the IDs.
Source node #1: 3e847649a037809619eccb2dfa2f6b7852f387ac #即127.0.0.1:6382@16382
Destination node #1: 4d172621eeeb51ce7b5201cf44f3187d69ebfcba #即127.0.0.1:6379@16379
上述命令執(zhí)行后,槽0-5460將從節(jié)點(diǎn)”127.0.0.1:6382@16382″移動(dòng)到節(jié)點(diǎn)”127.0.0.1:6379@16379″上。在槽遷移過(guò)程中,Redis會(huì)使用復(fù)制流量(Replication Traffic)將源節(jié)點(diǎn)上的數(shù)據(jù)復(fù)制到目標(biāo)節(jié)點(diǎn)上,以保證數(shù)據(jù)不會(huì)丟失。根據(jù)源節(jié)點(diǎn)的數(shù)據(jù)大小和網(wǎng)絡(luò)寬帶等因素,槽遷移可能需要一定的時(shí)間。
Redis中的槽負(fù)載均衡
Redis中的槽負(fù)載均衡是指將key映射到槽中的過(guò)程,它是由Redis的哈希函數(shù)實(shí)現(xiàn)的。在Redis中,使用的哈希函數(shù)是MurmurHash2,它具有一致性哈希算法的特點(diǎn),即相同key的哈希值總是映射到同一個(gè)槽中。這樣,就可以保證訪問(wèn)相同key的請(qǐng)求總是被路由到同一個(gè)Redis節(jié)點(diǎn)上,從而避免了跨節(jié)點(diǎn)的網(wǎng)絡(luò)開(kāi)銷。
除此之外,Redis還提供了對(duì)槽的手動(dòng)分配功能,使用戶可以自定義將哪些key映射到哪些槽里。這些手動(dòng)分配的信息可以通過(guò)命令”cluster slots”來(lái)查看。例如,下面的命令可以手動(dòng)將鍵”foo”和”bar”映射到槽0上:
127.0.0.1:6379> cluster addslots 0
OK
127.0.0.1:6379> set foo 1
OK
127.0.0.1:6379> set bar 2
OK
127.0.0.1:6379> cluster slots
1) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 6379
3) "-"
4) 1) (integer) 5461
2) (integer) 10922
3) "127.0.0.1"
5) 1) (integer) 10923
2) (integer) 16383
3) "127
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站欄目:探索Redis中key槽特性的深入查看(redis查看key的槽)
文章分享:http://m.fisionsoft.com.cn/article/dpjhjgj.html


咨詢
建站咨詢
