面试题答案
一键面试扩容情况
- 负载因子过高:Redis 中通过负载因子(load factor)来衡量哈希表的装填程度,计算公式为:负载因子 = 哈希表已保存节点数量 / 哈希表大小。当负载因子大于等于 1 且服务器目前没有在执行 BGSAVE 命令或者 BGREWRITEAOF 命令时,Redis 会对哈希表进行扩容。另外,当负载因子大于等于 5 时,无论服务器是否在执行持久化相关命令,都会强制进行扩容。
- 哈希表为空:在 Redis 初始化字典时,如果哈希表为空,会立即为哈希表分配空间,此时也相当于一种特殊的“扩容”。
扩容步骤
- 分配空间:为新的哈希表分配更大的内存空间。新哈希表的大小一般是原哈希表大小的 2 倍,如果原哈希表大小为 0,则新哈希表大小为 4。
- 设置新哈希表:将新分配的哈希表设置为字典的
ht[1]
,原哈希表仍保留在ht[0]
。 - 数据迁移:逐步将
ht[0]
中的所有键值对重新计算哈希值并插入到ht[1]
中。在数据迁移过程中,Redis 不是一次性迁移完所有数据,而是在每次对字典执行增删改查操作时,顺便从ht[0]
中迁移一部分数据到ht[1]
。 - 切换哈希表:当
ht[0]
中的所有键值对都迁移到ht[1]
后,释放ht[0]
所占用的内存空间,将ht[1]
设置为ht[0]
,并将ht[1]
重新初始化为空哈希表,为下一次扩容做准备。