ZBLOG

int dictRehash(dict *d, int n) { int empty_visits = n*10; /* Max number of empty buckets to visit. */ unsigned long s0 = d->ht[0].size; unsigned long s1 = d->ht[1].size; if (dict_can_resize == DICT_RESIZE_FORBID || !dictIsRehashing...

这个函数是 Redis 中进行字典重新哈希(rehash)的过程。

首先,它定义了一个变量 empty_visits,表示最大访问空桶的次数。

然后,它获取当前字典的两个哈希表的大小 s0s1

接下来,根据一些条件进行判断是否需要进行重新哈希:

  • 如果 dict_can_resize 等于 DICT_RESIZE_FORBID,或者当前字典没有在进行重新哈希,则直接返回 0。
  • 如果 dict_can_resize 等于 DICT_RESIZE_AVOID 并且以下任一条件成立:新哈希表的大小 s1 大于原始哈希表大小 s0 且他们的比率小于 dict_force_resize_ratio;或者新哈希表的大小 s1 小于原始哈希表大小 s0 且他们的比率小于 dict_force_resize_ratio,则直接返回 0。

之后,进入循环。在每次迭代中,它会遍历原始哈希表中索引为 d->rehashidx 的桶,并将其中所有键从旧哈希表移动到新哈希表。具体操作如下:

  • 首先通过计算键值对应的新哈希表索引。
  • 将该键添加到新哈希表中对应索引处,并更新相关计数器。
  • 继续处理下一个键。

完成一次迭代后,将原始哈希表中当前索引的桶置为空,并递增 d->rehashidx

在循环结束后,检查是否已经重新哈希了整个哈希表。如果是,则进行一些清理工作:释放旧哈希表的内存,将新哈希表赋值给旧哈希表,重置新哈希表的状态和 d->rehashidx,然后返回 0 表示完成重新哈希。

如果仍有剩余的键需要重新哈希,则返回 1,表示还需进行更多的迭代。

另外附上一个辅助函数 timeInMilliseconds,用于获取当前时间(以毫秒为单位)。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=3837

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?