《探錯筆記》之Redis的鍵rehash現象

什麼是鍵rehash現象

在redis中,鍵值以哈西表的方式進行存儲,在鍵值對的數目比較多時,哈西值衝突的次數就會變多,這會降低檢索效率。爲了減少哈西表中的地址衝突次數,redis會增加鍵值空間,重新定義鍵值對的映射地址,也就是進行所謂的rehash。

Redis的鍵rehash現象出現情形

若實例化 JedisShardInfo 時不設置節點名稱(name屬性),那麼當Redis節點列表的順序發生變化時,會發生“ 鍵 rehash 現象 ”
ps:本文基於Jedis2.6,非高版本或lettuce等其他框架

解決途徑之Sharded的initialize(…)方法實現

JedisShardInfo不設置節點名稱(name屬性),那麼當Redis節點列表的順序發生變化時,會發生“鍵 rehash 現象”;

唯一節點名稱+編號(推薦)

較好地一致性hash策略 是:唯一節點名稱+編號,不要考慮權重因素!

long hash = algo.hash(shardInfo.getName() + "*" + n)

所以, 在配置Redis服務列表時,必須要設置節點邏輯名稱(name屬性) 。

redis.server.list=192.168.1.31:6379: Shard-01 ,192.168.1.32:6379: Shard-02 ,192.168.1.33:6379: Shard-03 ,192.168.1.34:6379: Shard-04

節點IP:端口號+編號

Memcached Java Client,就是採用這種策略。

缺點: 因機房遷移等原因,可能導致節點IP發生改變!

this.algo.hash(shardInfo.getName() + “*” + shardInfo.getWeight() + n)

優點 :這樣設計避免了上面"因節點順序調整而引發rehash"的問題,不推薦

缺點 :"節點名稱+權重"必須是唯一的,否則節點會出現重疊覆蓋! 同時,"節點名稱+ 權重"必須不能被中途改變!

this.algo.hash(“SHARD-” + i + “-NODE-” + n)

優點 :無,不推薦
缺點 :將節點的順序索引i作爲hash的一部分! 當節點順序被無意識地調整了,會觸發”鍵 rehash 現象” ,那就杯具啦!("因節點順序調整而引發rehash"的問題)


關注Github:1/2極客

關注博客:御前提筆小書童

關注網站:HuMingfeng

關注公衆號:開發者的花花世界

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章