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