本文已参与「新人创作礼」活动,一起开启掘金创作之路。
继上篇文章,继续谈谈散列表的动态扩容相关内容以及一致性hash
动态扩容
在散列表中,扩容后即会重新计算每一个key的散列值然后搬移到新的散列表中,这势必是需要时间计算的,如果此时有插入操作发生,就会发生极个别非常慢的插入操作。
如何避免这种现象?答案就是非一致性扩容。
- 扩容时仅仅扩容而不搬移数据
- 当有新数据要插入时,我们将新数据插入新散列表中,并且从老的散列表中拿出一个数据放入到新散列表。
- 重复以上2操作
分布式存储导致缓存雪崩
背景:分布式缓存。我们有海量的数据需要缓存,所以一个缓存机 器肯定是不够的。于是,我们就需要将数据分布在多台机器上,假设我们的集群机器数量是10。如果数据增多,原来的 10 个机器已经无法承受了,我们就需要扩容了,比如扩到 11 个机器,这时候麻烦就来了...
这会导致海量数据要重新计算hash值,也称为缓存雪崩。
这时候,一致性哈希算法就要登场了
一致性hash
一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。
原理:
- 构建环形hash空间
- 将服务器节点都映射到此环形空间
- 首先确定对象hash 值在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器
- 当发生增删服务器节点时,仅影响一部分机器: