1. 哈希表(Hash Table)
Redis 使用哈希表来存储键值对。哈希表通过哈希函数将键映射到哈希槽(或哈希桶)。由于哈希函数的特性,不同的键可能会被映射到同一个哈希槽中,这就产生了键冲突。
2. 链地址法(Chaining)
Redis 采用链地址法(Chaining)来处理键冲突。链地址法是处理哈希冲突的一种常见技术。其基本思想是将所有映射到同一哈希槽的键值对存储在一个链表(或链式结构)中。
工作原理:
- 哈希计算:Redis 使用哈希函数计算键的哈希值,并确定其对应的哈希槽。
- 插入操作:如果哈希槽为空,则将键值对插入到该槽中。如果不为空,则将新的键值对追加到该槽的链表中。
- 查找操作:当查找一个键时,Redis 计算键的哈希值,并在对应的哈希槽中遍历链表以找到匹配的键。
3. 再哈希(Rehashing)
为了保持哈希表的性能,Redis 支持动态扩展和再哈希(Rehashing)。当哈希表中的键值对数量达到一定比例时,Redis 会创建一个更大的哈希表,并将现有的键值对重新分布到新的哈希表中。
工作原理:
- 创建新哈希表:Redis 创建一个新的、更大的哈希表。
- 迁移键值对:逐步将旧哈希表中的键值对迁移到新哈希表中。Redis 采用渐进式再哈希(Incremental
Rehashing),即在处理常规请求的同时,逐步完成再哈希过程,以避免一次性再哈希带来的性能影响。 - 删除旧哈希表:当再哈希完成后,删除旧的哈希表。