[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-aE16YC6T-1649930007495)(./picture/哈希槽分區(qū).png)]
1.為什么出現(xiàn)?
? 哈希槽實(shí)質(zhì)就是一個(gè)數(shù)組,數(shù)組[0,2^14 -1]形成hash slot空間。
?
2.能干什么
? 解決均勻分配的問題,在數(shù)據(jù)和節(jié)點(diǎn)之間又加入了一層,把這層稱為哈希槽(slot),用于管理數(shù)據(jù)和節(jié)點(diǎn)之間的關(guān)系,現(xiàn)在就相當(dāng)于節(jié)點(diǎn)上放的是槽,槽里放的是數(shù)據(jù)。
槽解決的是粒度問題,相當(dāng)于把粒度變大了,這樣便于數(shù)據(jù)移動。
哈希解決的是映射問題,使用key的哈希值來計(jì)算所在的槽,便于數(shù)據(jù)分配。
?
3.多少個(gè)hash槽
一個(gè)集群只能有16384個(gè)槽,編號0-16383(0-2^14-1)。這些槽會分配給集群中的所有主節(jié)點(diǎn),分配策略沒有要求??梢灾付男┚幪柕牟鄯峙浣o哪個(gè)主節(jié)點(diǎn)。集群會記錄節(jié)點(diǎn)和槽的對應(yīng)關(guān)系。解決了節(jié)點(diǎn)和槽的關(guān)系后,接下來就需要對key求哈希值,然后對16384取余,余數(shù)是幾key就落入對應(yīng)的槽里。slot = CRC16(key) % 16384。以槽為單位移動數(shù)據(jù),因?yàn)椴鄣臄?shù)目是固定的,處理起來比較容易,這樣數(shù)據(jù)移動問題就解決了。
哈希槽計(jì)算:
Redis 集群中內(nèi)置了 16384 個(gè)哈希槽,redis 會根據(jù)節(jié)點(diǎn)數(shù)量大致均等的將哈希槽映射到不同的節(jié)點(diǎn)。當(dāng)需要在 Redis 集群中放置一個(gè) key-value時(shí),redis 先對 key 使用 crc16 算法算出一個(gè)結(jié)果,然后把結(jié)果對 16384 求余數(shù),這樣每個(gè) key 都會對應(yīng)一個(gè)編號在 0-16383 之間的哈希槽,也就是映射到某個(gè)節(jié)點(diǎn)上。如下代碼,key之A 、B在Node2, key之C落在Node3上
?