redis字典结构,hash冲突怎么办,rehash,负载因子

219 阅读2分钟

哈希冲突

当两个不同的键被哈希函数映射到同一个索引时,就会发生哈希冲突。Redis 使用链地址法(也称为分离链表法)来解决这种冲突。简单来说,每个哈希桶不仅仅存储一个键值对,而是一个链表,链表中的每个节点都存储一个键值对。当发生哈希冲突时,新的键值对会被添加到对应哈希桶的链表中。

Rehash

随着字典中键值对的增加或减少,Redis 的哈希表可能会变得不够高效(例如,太多的哈希冲突导致链表过长,降低了查找效率)。为了解决这个问题,Redis 会对哈希表进行重哈希(Rehash)。

Rehash 的过程是这样的:

  1. Redis 会创建一个新的哈希表,其大小是原哈希表大小的两倍(如果原哈希表是空的或者大小小于 hash_max_ziplist_entries,则新哈希表的大小为 4)。
  2. Redis 会遍历原哈希表的每个桶,将桶中的键值对重新哈希到新哈希表的相应位置。
  3. 当所有键值对都被迁移到新哈希表后,原哈希表会被释放,新哈希表成为当前的哈希表。

这个 Rehash 过程是渐进式的,这意味着它不会一次性完成,而是分批次进行,以便在不影响 Redis 性能的前提下完成 Rehash。

负载因子

Redis 使用负载因子来决定何时进行 Rehash。负载因子定义为:当前哈希表已存储的键值对数量 / 当前哈希表的大小。当负载因子超过某个阈值(默认为 0.1,即哈希表使用了 10% 的空间)时,Redis 会开始 Rehash。

通过动态调整哈希表的大小和渐进式的 Rehash 策略,Redis 能够高效地处理哈希冲突,保持字典结构的性能和效率。