解决哈希冲突的方法
-
开放定址法:当一个key经过哈希函数得到的哈希地址冲突时,以计算出来的哈希地址为基础,产生另一个地址,如果还是冲突,继续以同样的方式取。直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
-
再哈希发:构造多个哈希函数,一个冲突换下一个。直到不冲突。。。不易产生聚类,增加计算时间。
-
链地址法: 将所有关键字为同义词的记录存储在同一线性链表中
- 建立公共溢出区:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
一致性哈希算法
面试官:你了解一致性Hash算法吗? - 沙滩de流沙 - 博客园 (cnblogs.com)
一致性哈希算法为了解决以上问题。
一致性哈希算法也是使用取模的方法,只是,刚才描述的取模法是对服务器的数量
进行取模,而一致性哈希算法是对2^32
取模。不必考虑服务器数量变化导致之前计算的hash映射作废。
hash环由2^32个点组成
通过公式将服务器映射到环上 :hash(服务器A的IP地址) % 2^32
同理我们也把缓存对象映射到环上: hash(图片名称) % 2^32
那么图片缓存在哪里呢?
从图片的位置开始,沿顺时针方向遇到的第一个服务器就是A服务器,所以,上图中的图片将会被缓存到服务器A上。
- 一致性哈希优点
某个服务器出现问题下线,那么缓存在这个服务器上的数据就会沿着顺时针找到下一个服务器缓存。其他不受影响的缓存对象,不改变位置
- 哈希环的倾斜 (缺点)
如果出现这种情况,很有可能大部分内容都缓存在一台服务器上,服务器没有充分利用,缓存极度不均匀。当a服务器出现问题时,极端情况下会引起系统崩溃。
- 虚拟节点解决倾斜问题
虚拟节点
是实际节点
(实际的物理服务器)在hash环上的复制品
,一个实际节点可以对应多个虚拟节点。