面试题答案
一键面试Redis渐进式rehash触发情况
- 负载因子达到阈值:Redis中哈希表的负载因子计算公式为
负载因子 = 哈希表已保存节点数量 / 哈希表大小
。当负载因子大于等于1且server.activerehashing
为0(未开启主动rehash)时,会触发渐进式rehash。默认情况下,当哈希表的负载因子大于等于1时,Redis会为哈希表分配大约两倍大小的新哈希表空间,然后开始渐进式地将旧哈希表中的数据迁移到新哈希表。 - 服务器执行一些管理任务时:例如在Redis执行
BGSAVE
或BGREWRITEAOF
等后台保存操作时,为了避免阻塞主线程,可能会触发渐进式rehash。因为这些后台操作会消耗一定的内存,此时如果哈希表负载较高,触发渐进式rehash有助于优化内存使用。
调整渐进式rehash触发阈值的操作
- 配置参数层面:Redis通过配置文件(
redis.conf
)或动态配置命令(CONFIG SET
)来管理相关参数。然而,Redis并没有直接暴露可配置的渐进式rehash触发阈值参数。不过,可以通过调整hash-max-ziplist-entries
和hash-max-ziplist-value
等与哈希表数据结构存储相关的参数间接影响rehash时机。例如,减小hash-max-ziplist-entries
的值,会使哈希表更快地从紧凑的ziplist结构转换为常规的哈希表结构,在一定程度上可能提前触发rehash。 - 代码层面:如果要精确控制渐进式rehash触发阈值,需要修改Redis源代码。主要涉及
dict.c
文件中的dictExpandIfNeeded
函数,该函数用于判断是否需要对哈希表进行扩展(触发rehash)。修改此函数中关于负载因子判断的逻辑部分,例如修改负载因子的比较阈值,然后重新编译安装Redis。但这种方式需要对Redis源码有深入理解,且不建议在生产环境轻易使用,因为会影响Redis的稳定性和与官方版本的兼容性。