一般算法:
對(duì)對(duì)象先hash然后對(duì)redis數(shù)量取模,如果結(jié)果是0就存在0的節(jié)點(diǎn)上仇穗。
? ?假設(shè)有0-3四個(gè)redis節(jié)點(diǎn)流部、20個(gè)數(shù)據(jù):
進(jìn)行取模后分布如下:
現(xiàn)在因?yàn)閴毫^(guò)大需要擴(kuò)容,增加一臺(tái)redis4纹坐、第五個(gè)節(jié)點(diǎn):
現(xiàn)在只有4個(gè)節(jié)點(diǎn)還能夠命中枝冀。命中率是:4/20 = 20%,命中率極其低下。(redis肯定是不會(huì)這樣用的)
二耘子、redis使用的consistent hashing(一致性hash算法)
1果漾、環(huán)形hash空間:
把對(duì)象映射到0-2的32次冪減1的空間里。
現(xiàn)在假設(shè)有4個(gè)對(duì)象:object1-object4谷誓,將四個(gè)對(duì)象hash后映射到環(huán)形空間中:
接下來(lái)把chche映射到hash空間(基本思想就是講對(duì)象和cache都映射到同一hash數(shù)值空間中绒障,并且使用相同的hash算法,可以使用cache的ip地址或者其他因子),假設(shè)現(xiàn)在有三個(gè)cache:
每個(gè)key順時(shí)針往下走捍歪,找到的第一個(gè)cache節(jié)點(diǎn)就是存儲(chǔ)位置:
現(xiàn)在移除一個(gè)cacheB節(jié)點(diǎn)户辱、這時(shí)候key4將找不到cache,key4繼續(xù)使用一致性hash算法運(yùn)算后算出最新的cacheC糙臼,以后存儲(chǔ)與讀取都將在cacheC上:
移除節(jié)點(diǎn)后的影響范圍在該節(jié)點(diǎn)逆時(shí)針計(jì)算到遇到的第一個(gè)cache節(jié)點(diǎn)之間的數(shù)據(jù)節(jié)點(diǎn)焕妙。
現(xiàn)在看一下增加一個(gè)節(jié)點(diǎn):
影響范圍為:添加節(jié)點(diǎn)逆時(shí)針遇到的第一個(gè)cache節(jié)點(diǎn)之間的數(shù)據(jù)節(jié)點(diǎn)。