一般算法:
對對象先hash然后對redis數量取模,如果結果是0就存在0的節點上。
1、2同上,假設有0-3四個redis節點、20個數據:
進行取模后分布如下:
現在因為壓力過大需要擴容,增加一台redis4、第五個節點:
現在只有4個節點還能夠命中。命中率是:4/20 = 20%,命中率極其低下。(redis肯定是不會這樣用的)
二、redis使用的consistent hashing(一致性hash算法)
1、環形hash空間:
把對象映射到0-2的32次冪減1的空間里。
現在假設有4個對象:object1-object4,將四個對象hash后映射到環形空間中:
接下來把chche映射到hash空間(基本思想就是講對象和cache都映射到同一hash數值空間中,並且使用相同的hash算法,可以使用cache的ip地址或者其他因子),假設現在有三個cache:
每個key順時針往下走,找到的第一個cache節點就是存儲位置:
現在移除一個cacheB節點、這時候key4將找不到cache,key4繼續使用一致性hash算法運算后算出最新的cacheC,以后存儲與讀取都將在cacheC上:
移除節點后的影響范圍在該節點逆時針計算到遇到的第一個cache節點之間的數據節點。
現在看一下增加一個節點:
影響范圍為:添加節點逆時針遇到的第一個cache節點之間的數據節點。(未完待續)
(文中圖為慕課網geely老師的電商平台課程視頻中的圖,知識點很多,講的非常好,:課程鏈接)