适用场景:缓存集群环境下
出现背景:
1.初始阶段:通过随机存取方式进行,将一个数据随机存入集群的一台服务器中,当使用到这个缓存数据的时候,不知道从集群哪台服务器中取数据,也无法判断有没有这个数据,导致数据冗余,而且服务器数量越多,导致的存取冗余次数无法估量。
2.中期阶段:由随机转向哈希取余,首先将一个数据存入集群服务器中,这个数据的key name作为这个数据的唯一标志,然后通过这个key name得到哈希值,接着取余,比如集群服务器有3台,用0,1,2作为他们的标识,hash % 3 得到标识,与服务器标识匹配,就可以把这数据存入该服务器,取的时候也通过key name 哈希取余匹配主机,从而找到缓存的数据。 但是这种方式也会出现一些问题,就是当某台主机宕掉或者增加一台主机的时候,导致无法匹配到原先存入数据的主机,导致大量数据失效。
3.发展阶段:由哈希取余转向一致性哈希,一致性哈希就是通过将整个哈希值组织成一个虚拟的圆环,且按顺时针方向组织,各服务器主机通过其唯一标志(ip或主机名)得到哈希值,在这个圆环中占坑,作为一个固定的节点,接着将一个数据存入,通过key name得到哈希值,形象地固定在环中某位置,顺时针查找找到第一个主机占坑位置,就把这个数据存入该主机中,取数据也是类似。若出现某台主机宕机了或者要增加某个主机,存入这个集群各个主机的数据会不会出现取数据失效,可以知道增加或减少一台主机,只是从逆时针方向找到第一个主机的区间缓存数据失效,其余均不变。但是这种方式也会出现一些极端情况出现,就是服务器占坑的位置非常接近,导致服务器在这圆环中数据匹配的区间差距很大。
4.后期阶段:采用虚拟节点来解决节点分部不均匀而造成数据倾斜的问题。