面试题答案
一键面试优化思路
- 虚拟节点:一致性哈希中引入虚拟节点,将每个真实节点映射为多个虚拟节点,均匀分布在哈希环上。这样可以使数据在哈希环上分布更均匀,减少数据倾斜。例如,将每个Redis实例映射为100个虚拟节点,使得数据在哈希环上的落点更分散。
- 链表结合:利用Redis链表的有序性和灵活性,每个哈希环上的节点(包括虚拟节点)可以维护一个链表,链表中存储该节点负责的数据项。这样在查找数据时,根据数据的哈希值找到对应的节点,然后在该节点的链表中进行查找。
链表操作
- 数据插入:当有新数据需要插入时,计算数据的哈希值,根据哈希值确定在哈希环上的节点。然后将数据插入到该节点对应的链表头部,因为链表头部插入操作时间复杂度为O(1)。例如,新数据key1的哈希值对应节点A,就在节点A的链表头部插入包含key1及其相关数据的节点。
- 数据查找:计算待查找数据的哈希值,定位到哈希环上的节点。然后从该节点的链表头开始遍历链表,比较链表节点中的数据与待查找数据,直到找到匹配的数据或者遍历完链表。时间复杂度在最坏情况下为O(n),n为链表长度,但由于虚拟节点的引入使得链表长度相对均匀,平均查找性能有所提升。
- 数据迁移:当节点发生变化(如增加或删除节点)时,需要迁移数据。以删除节点为例,找到要删除节点对应的链表,将链表中的数据重新计算哈希值,确定新的归属节点,然后将数据插入到新节点的链表中。例如,节点B要删除,遍历节点B的链表,对于链表中的每个数据项重新计算哈希值,若新哈希值对应节点C,则将该数据插入到节点C的链表头部。在增加节点时,类似地将部分数据从相邻节点迁移到新节点,通过链表的插入操作完成。