hash;简单的hash取余
优点:
计算简单,快速定位
缺点:
容错和扩展差,任何的增加机器或减少机器,都会伴随着重新set值
比如原来有五台机器做缓存,现在加一台,那么余5就变成余6,那么所有值都变了
操作不当的话短时间可能会造成缓存雪崩(一般只能成倍扩展)
一致性hash:hash环
想象一个环,共有2^32-1 个节点,如果有五台机器缓存,那么就将这五台的ip分别hash后对2^32-1取余,得到的结果肯定在这个环上,我们叫这个结果为落在某一个节点上
顺时针数,每个节点到前一个节点直接的值,将属于这个节点。
举个例子:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针行走,第一台遇到的服务器就是其应该定位到的服务器。
优点:
增加机器和减少机器,对整体影响不大,尤其是机器特别多的情况下,影响更小
缺点:
如果几个ip计算出来的节点不均匀,可能会出现缓存倾斜,比如一个机器上的缓存特别多,另一个机器上的缓存特别少
但是,针对这种问题,有成熟的解决方案,例如用虚拟节点。
比如现在有两个机器a,b,那么基本上肯定会出现缓存倾斜,那么我们就做出几个虚拟节点,a_1,a_2,a_3,b_1,b_2,b_3
用这些再做计算,基本上就可以做到相对平均了,
一般生产过程中,一个机器都会做出32个虚拟节点,来防止缓存倾斜
总结
简单常见用hash就行,重要场景考虑一致性hash