数据结构与算法(3)

110 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

继上篇文章,继续谈谈散列表的动态扩容相关内容以及一致性hash

动态扩容

在散列表中,扩容后即会重新计算每一个key的散列值然后搬移到新的散列表中,这势必是需要时间计算的,如果此时有插入操作发生,就会发生极个别非常慢的插入操作。

如何避免这种现象?答案就是非一致性扩容。

  1. 扩容时仅仅扩容而不搬移数据
  2. 当有新数据要插入时,我们将新数据插入新散列表中,并且从老的散列表中拿出一个数据放入到新散列表。
  3. 重复以上2操作

分布式存储导致缓存雪崩

背景:分布式缓存。我们有海量的数据需要缓存,所以一个缓存机 器肯定是不够的。于是,我们就需要将数据分布在多台机器上,假设我们的集群机器数量是10。如果数据增多,原来的 10 个机器已经无法承受了,我们就需要扩容了,比如扩到 11 个机器,这时候麻烦就来了...

这会导致海量数据要重新计算hash值,也称为缓存雪崩

这时候,一致性哈希算法就要登场了


一致性hash

一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。

原理:

  1. 构建环形hash空间
  2. 将服务器节点都映射到此环形空间
  3. 首先确定对象hash 值在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器
  4. 当发生增删服务器节点时,仅影响一部分机器: