一致性哈希算法可以極大地緩解Redis中緩存失效的問(wèn)題。
基本步驟:
1.在一個(gè)圈上順時(shí)針的標(biāo)注2^{32}個(gè)點(diǎn),從0到2^{32}-1
2.將每個(gè)Redis節(jié)點(diǎn)用Hash算法(可以利用IP或者服務(wù)器名來(lái)計(jì)算)得到每個(gè)節(jié)點(diǎn)的Hash值
3.將需要存儲(chǔ)的數(shù)據(jù)的key值用同樣的Hash算法計(jì)算得出相應(yīng)的Hash值
4.從數(shù)據(jù)映射得到的Hash值對(duì)應(yīng)圈的位置順時(shí)針找媒楼,將對(duì)應(yīng)數(shù)據(jù)存放到第一個(gè)找到的節(jié)點(diǎn)位置
如果節(jié)點(diǎn)通過(guò)Hash值計(jì)算后在圈中分布不均勻佑附,就會(huì)造成數(shù)據(jù)傾斜問(wèn)題
改進(jìn):引入虛擬節(jié)點(diǎn)镇眷,即對(duì)每一個(gè)服務(wù)節(jié)點(diǎn)計(jì)算多個(gè)哈希吧史,每個(gè)計(jì)算結(jié)果位置都放置一個(gè)此服務(wù)節(jié)點(diǎn),稱為虛擬節(jié)點(diǎn)
例如:在對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行Hash計(jì)算的時(shí)候是利用節(jié)點(diǎn)的ip蕴轨,可以在ip后面增加一個(gè)編號(hào)港谊,如192.168.0.1#001、192.168.0.1#002橙弱、192.168.0.1#003等歧寺。運(yùn)用這種機(jī)制,即使在節(jié)點(diǎn)數(shù)很少的情況下也可以讓數(shù)據(jù)比較均勻的分布在不同的節(jié)點(diǎn)上
運(yùn)用一致性哈希算法的好處就是棘脐,在增刪節(jié)點(diǎn)的時(shí)候斜筐,只有相鄰的節(jié)點(diǎn)的緩存數(shù)據(jù)會(huì)受到影響。