MST

星途 面试题库

面试题:Redis渐进式rehash的触发条件及如何调整触发阈值

请详细说明Redis渐进式rehash通常在什么情况下会被触发,例如负载因子达到何种程度等。并且,如果在实际应用场景中,需要根据业务需求调整渐进式rehash的触发阈值,应该如何操作,涉及到哪些配置参数或者代码层面的修改。
11.3万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis渐进式rehash触发情况

  1. 负载因子达到阈值:Redis中哈希表的负载因子计算公式为负载因子 = 哈希表已保存节点数量 / 哈希表大小。当负载因子大于等于1且server.activerehashing为0(未开启主动rehash)时,会触发渐进式rehash。默认情况下,当哈希表的负载因子大于等于1时,Redis会为哈希表分配大约两倍大小的新哈希表空间,然后开始渐进式地将旧哈希表中的数据迁移到新哈希表。
  2. 服务器执行一些管理任务时:例如在Redis执行BGSAVEBGREWRITEAOF等后台保存操作时,为了避免阻塞主线程,可能会触发渐进式rehash。因为这些后台操作会消耗一定的内存,此时如果哈希表负载较高,触发渐进式rehash有助于优化内存使用。

调整渐进式rehash触发阈值的操作

  1. 配置参数层面:Redis通过配置文件(redis.conf)或动态配置命令(CONFIG SET)来管理相关参数。然而,Redis并没有直接暴露可配置的渐进式rehash触发阈值参数。不过,可以通过调整hash-max-ziplist-entrieshash-max-ziplist-value等与哈希表数据结构存储相关的参数间接影响rehash时机。例如,减小hash-max-ziplist-entries的值,会使哈希表更快地从紧凑的ziplist结构转换为常规的哈希表结构,在一定程度上可能提前触发rehash。
  2. 代码层面:如果要精确控制渐进式rehash触发阈值,需要修改Redis源代码。主要涉及dict.c文件中的dictExpandIfNeeded函数,该函数用于判断是否需要对哈希表进行扩展(触发rehash)。修改此函数中关于负载因子判断的逻辑部分,例如修改负载因子的比较阈值,然后重新编译安装Redis。但这种方式需要对Redis源码有深入理解,且不建议在生产环境轻易使用,因为会影响Redis的稳定性和与官方版本的兼容性。