面试题答案
一键面试哈希算法原理
哈希算法通过一个特定的函数,将任意长度的输入数据转换为固定长度的哈希值。对于相同的输入,哈希函数总是产生相同的哈希值,且哈希值具有较好的离散性,即不同的输入产生的哈希值尽可能均匀分布在哈希空间内。
数据分片
- 普通哈希分片:在Redis分布式存储早期,可能使用简单的哈希取模法。例如,假设有N个Redis节点,对于要存储的键值对中的键
key
,先计算其哈希值hash(key)
,然后通过hash(key) % N
得到一个余数,该余数对应着数据应该存储的节点编号。这样就将数据均匀地分布到了各个节点上。 - 一致性哈希:为解决普通哈希在节点数量变化时大量数据迁移的问题,一致性哈希应运而生。一致性哈希将整个哈希值空间组织成一个虚拟的圆环(哈希环)。每个节点在环上占据一个位置,通过计算节点的哈希值来确定其在环上的位置。对于数据的键
key
,同样计算其哈希值hash(key)
,然后沿顺时针方向在环上寻找第一个大于等于该哈希值的节点,该节点就是数据的存储位置。这种方式使得在节点数量变化时,只有部分数据需要迁移,减少了数据迁移量。
节点扩展时保证数据一致性和高效访问
- 数据一致性:
- 普通哈希分片:当增加或减少节点时,即N发生变化,
hash(key) % N
的结果会改变,导致大量数据需要重新计算存储节点并迁移,数据一致性难以保证。 - 一致性哈希:在一致性哈希中,新增节点时,只需要将该节点逆时针方向到前一个节点之间的数据迁移到新节点;减少节点时,只需要将该节点的数据迁移到顺时针方向的下一个节点。这样极大地减少了数据迁移量,保证了大部分数据的一致性。
- 普通哈希分片:当增加或减少节点时,即N发生变化,
- 高效访问:
- 普通哈希分片:由于节点数量变化时数据大量迁移,可能导致缓存命中率降低,影响访问效率。
- 一致性哈希:因为节点变化时数据迁移量小,原有的缓存数据大部分仍然有效,缓存命中率相对稳定,从而保证了高效访问。同时,通过引入虚拟节点的概念,可以进一步优化节点负载均衡,提高整体的访问效率。虚拟节点是对物理节点的多次映射,使得每个物理节点在哈希环上有多个位置,避免了节点分布不均匀导致的负载不均衡问题。