首頁  >  文章  >  資料庫  >  redis為什麼16384個槽

redis為什麼16384個槽

步履不停
步履不停原創
2019-06-24 11:30:435773瀏覽

redis為什麼16384個槽

Redis 叢集並沒有使用一致性hash,而是引入了哈希槽的概念。 Redis 集群有16384個哈希槽,每個key透過CRC16校驗後對16384取模來決定放置哪個槽,集群的每個節點負責一部分hash槽。但為什麼哈希槽的數量是16384(2^14)個呢,這個問題在github上有人提過,作者也給了解答,下面我們來簡單分析一下。

為什麼是16384(2^14)個?

在redis節點發送心跳包時需要把所有的槽放到這個心跳包裡,以便讓節點知道當前集群信息,16384=16k,在發送心跳包時使用bitmap壓縮後是2k(2 * 8 (8 bit) * 1024(1k) = 2K),也就是說使用2k的空間創造了16k的槽數。

雖然使用CRC16演算法最多可以分配65535(2^16-1)個槽位,65535=65k,壓縮後就是8k(8 * 8 (8 bit) * 1024(1k) = 8K),也就是說需要需要8k的心跳包,作者認為這樣做不太值得;並且一般情況下一個redis集群不會有超過1000個master節點,所以16k的槽位是個比較合適的選擇。

作者原話:

1、普通心跳資料包攜帶節點的完整配置,此配置可以用舊配置以冪等方式替換,以便更新舊配置。這意味著它們包含原始形式的節點的槽配置,16k的槽配置需要使用2k記憶體空間,但是使用65k槽將使用8k的記憶體空間。

2、同時,由於其他設計折衷,Redis叢集不可能擴展到超過1000個節點。

因此,16k是比較合適的,可以確保每個主設備有足夠的槽,最大為1000個。 redis的node配置資訊透過位圖儲存傳輸的,傳輸前有一個壓縮過程,壓縮比跟槽個數和節點數有很大關係(because when N is small the bitmap would have slots/N bits set that is a large percentage of bits set.)【槽數/節點數】當這個N越大,壓縮比就越小。

更多Redis相關技術文章,請造訪Redis教學欄位學習!

以上是redis為什麼16384個槽的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn