MST

星途 面试题库

面试题:Redis字典中哈希表的扩容机制是怎样的

请详细阐述Redis字典中哈希表在什么情况下会进行扩容,以及扩容的具体步骤是什么。
41.6万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

扩容情况

  1. 负载因子过高:Redis 中通过负载因子(load factor)来衡量哈希表的装填程度,计算公式为:负载因子 = 哈希表已保存节点数量 / 哈希表大小。当负载因子大于等于 1 且服务器目前没有在执行 BGSAVE 命令或者 BGREWRITEAOF 命令时,Redis 会对哈希表进行扩容。另外,当负载因子大于等于 5 时,无论服务器是否在执行持久化相关命令,都会强制进行扩容。
  2. 哈希表为空:在 Redis 初始化字典时,如果哈希表为空,会立即为哈希表分配空间,此时也相当于一种特殊的“扩容”。

扩容步骤

  1. 分配空间:为新的哈希表分配更大的内存空间。新哈希表的大小一般是原哈希表大小的 2 倍,如果原哈希表大小为 0,则新哈希表大小为 4。
  2. 设置新哈希表:将新分配的哈希表设置为字典的 ht[1],原哈希表仍保留在 ht[0]
  3. 数据迁移:逐步将 ht[0] 中的所有键值对重新计算哈希值并插入到 ht[1] 中。在数据迁移过程中,Redis 不是一次性迁移完所有数据,而是在每次对字典执行增删改查操作时,顺便从 ht[0] 中迁移一部分数据到 ht[1]
  4. 切换哈希表:当 ht[0] 中的所有键值对都迁移到 ht[1] 后,释放 ht[0] 所占用的内存空间,将 ht[1] 设置为 ht[0],并将 ht[1] 重新初始化为空哈希表,为下一次扩容做准备。