Redis 在解决哈希表中的键冲突时采用了链地址法(Separate Chaining)。这意味着当两个或以上的键通过哈希函数映射到同一个哈希桶(数组索引)时,Redis 不会改变键的位置,而是将这些键值对组织成一个链表,链接在同一个数组索引下。
具体来说,在 Redis 的内部实现中,哈希表的每个桶实际上是一个链表节点(dictEntry)的指针,当发生冲突时,新来的键值对将会被添加到链表的头部。这种做法的好处在于即使在高冲突的情况下也能维持较好的性能,因为查找、插入和删除操作只需沿着链表进行。
此外,Redis 的字典(dictionary)会在必要时自动进行扩容或缩容操作,以维持较低的负载因子(已存储键值对数量与哈希表总槽位数之比),进一步降低冲突概率,提高查找效率。当负载因子超过设定阈值时,Redis 会创建一个新的更大的哈希表,并将旧表中的所有键值对重新哈希到新表中,这一过程被称为渐进式 rehash。渐进式 rehash 是逐次、分批进行的,避免一次性全部迁移带来的性能压力。