先說普通雜湊演算法:讓資料id的雜湊值和redis集群的個數取模,得到的是幾這個資料就存放在哪個redis伺服器上
普通雜湊演算法存在資料遷移的問題,即當集群數量增加或減少,原來資料的key與redis序號對應的集群關係會改變,可能第一次資料1落在0號redis上,第二次資料1就落在了2號機器上。這樣就會出現」快取穿透「
一致性雜湊演算法
一致性雜湊演算法首先弄了乙個虛擬環,環上有n個節點,比如2的32次方個節點。這個環僅僅是邏輯上的乙個演算法。它先用redis機器序號+redis的ip生成唯一的乙個雜湊值。用redis的雜湊值取模2的32次方,這樣會生產乙個點,落在這個環上的某乙個點,這個點也叫做redis1的起始節點。同理算出redis2的起始節點。有2給其實節點後就會勾勒出2給redis快取的資料範圍。
現在我們把要存入物件的hash值算出來,用這個hash值取模2的32次方。算出的點要麼會落在redis1的管轄範圍中,要麼會落在redis2的管轄範圍中。然後redis1機器快取對應的kv,redis2機器快取對應的kv
一致性雜湊演算法相比普通雜湊大大減少了資料遷移問題,假如在redis1和redis2中間新增了乙個redis3,只需要把1-3中間的資料進行資料遷移。
但一致性雜湊演算法會造成資料傾斜,即很可能少量redis上有大量的快取, 大量的redis上有少量的快取
雜湊槽解決資料傾斜問題
雜湊槽的思想是對每台redis都進行邏輯上的分片,儲存原理和一致性雜湊演算法類似,只不過把環變成了槽。可允許自定義設定槽數,最多可有16384個,當槽足夠多,每個槽的資料會分布的更加均勻。解決了傾斜的問題
我們也可以自己實現,在邏輯上給每個redis分割成多個虛擬節點node,進行儲存資料~
一致性雜湊演算法
好吧,我們決定打破這種基於資料項商業邏輯的劃分思維,來考慮一種基於 key 的劃分方式,這有些類似於後面介紹的資料庫水平分割槽 sharding 我們需要設計一種不依賴資料項內容的雜湊演算法,將所有資料項的 key 均衡分配在這三颱快取伺服器上。乙個簡單而有效的方法是 取餘 運算,這就像打撲克時的發...
一致性雜湊演算法
在分布式系統中,如果某業務可以由多個相同的節點處理,很容易想到用hash的方式將業務請求分散到這些節點處理,如果有n個節點,計算方法為 hash id n。如果只是簡單的計算,不涉及使用者狀態,這是乙個簡單有效的方案。如果節點的計算涉及使用者狀態,比如維護購物車 memcache快取服務等,好像也沒...
一致性雜湊演算法
判定好壞的四個定義 1 平衡性 balance 平衡性是指雜湊的結果能夠盡可能分布到所有的緩衝中去,這樣可以使得所有的緩衝空間都得到利用。很多雜湊演算法都能夠滿足這一條件。2 單調性 monotonicity 單調性是指如果已經有一些內容通過雜湊分派到了相應的緩衝中,又有新的緩衝加入到系統中。雜湊的...