2六、redis中默認有多少個哈希槽?

Redis 集羣中內置了 16384 個哈希槽,當須要在 Redis 集羣中放置一個 key-value時,redis 先對 key 使用 crc16 算法算出一個結果,而後把結果對 16384 求餘數,這樣每一個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不一樣的節點。redis

Redis 集羣沒有使用一致性hash, 而是引入了哈希槽的概念。算法

Redis 集羣有16384個哈希槽,每一個key經過CRC16校驗後對16384取模來決定放置哪一個槽.集羣的每一個節點負責一部分hash槽。這種結構很容易添加或者刪除節點,而且不管是添加刪除或者修改某一個節點,都不會形成集羣不可用的狀態。spa

使用哈希槽的好處就在於能夠方便的添加或移除節點。hash

當須要增長節點時,只須要把其餘節點的某些哈希槽挪到新節點就能夠了;集羣

當須要移除節點時,只須要把移除節點上的哈希槽挪到其餘節點就好了;數據

在這一點上,咱們之後新增或移除節點的時候不用先停掉全部的 redis 服務。di

 

"用了哈希槽的概念,而沒有用一致性哈希算法,不都是哈希麼?這樣作的緣由是爲何呢?"
Redis Cluster是本身作的crc16的簡單hash算法,沒有用一致性hash。Redis的做者認爲它的crc16(key) mod 16384的效果已經不錯了,雖然沒有一致性hash靈活,但實現很簡單,節點增刪時處理起來也很方便。co

"爲了動態增刪節點的時候,不至於丟失數據麼?"
節點增刪時不丟失數據和hash算法沒什麼關係,不丟失數據要求的是一份數據有多個副本。生成

「還有集羣總共有2的14次方,16384個哈希槽,那麼每個哈希槽中存的key 和 value是什麼?」
當你往Redis Cluster中加入一個Key時,會根據crc16(key) mod 16384計算這個key應該分佈到哪一個hash slot中,一個hash slot中會有不少key和value。你能夠理解成表的分區,使用單節點時的redis時只有一個表,全部的key都放在這個表裏;改用Redis Cluster之後會自動爲你生成16384個分區表,你insert數據時會根據上面的簡單算法來決定你的key應該存在哪一個分區,每一個分區裏有不少key。

相關文章
相關標籤/搜索