天天看點

Redis 哈希槽概念

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

Redis 叢集沒有使用一緻性hash, 而是引入了哈希槽的概念。

Redis 叢集有16384個哈希槽,每個key通過CRC16校驗後對16384取模來決定放置哪個槽.叢集的每個節點負責一部分hash槽。這種結構很容易添加或者删除節點,并且無論是添加删除或者修改某一個節點,都不會造成叢集不可用的狀态。

使用哈希槽的好處就在于可以友善的添加或移除節點。

當需要增加節點時,隻需要把其他節點的某些哈希槽挪到新節點就可以了;

當需要移除節點時,隻需要把移除節點上的哈希槽挪到其他節點就行了;

在這一點上,我們以後新增或移除節點的時候不用先停掉所有的 redis 服務。

“用了哈希槽的概念,而沒有用一緻性雜湊演算法,不都是哈希麼?這樣做的原因是為什麼呢?”

Redis Cluster是自己做的crc16的簡單hash算法,沒有用一緻性hash。Redis的作者認為它的crc16(key) mod 16384的效果已經不錯了,雖然沒有一緻性hash靈活,但實作很簡單,節點增删時處理起來也很友善。

“為了動态增删節點的時候,不至于丢失資料麼?”

節點增删時不丢失資料和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個分區表,你插入資料時會根據上面的簡單算法來決定你的key應該存在哪個分區,每個分區裡有很多key。

上一篇: Redis 哈希槽
下一篇: Redis哈希槽

繼續閱讀