news 2026/5/1 0:24:15

Redis原理篇-Dict的rehash

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis原理篇-Dict的rehash

**

不管是扩容还是收缩,必定会创建新的哈希表,导致哈希表的size和sizemask变化,而key的查询与sizemask有关。因此必须对哈希表中的每一个key重新计算索引,插入新的哈希表,这个过程称为rehash。过程是这样的:

Dict的rehash并不是一次性完成的。试想一下,如果Dict中包含数百万的entry,要在一次rehash完成,极有可能导致主线程阻塞。因此Dict的rehash是分多次、渐进式的完成,因此称为渐进式rehash。流程如下:

  1. 计算新hash表的realeSize,值取决于当前要做的是扩容还是收缩:
    1. 如果是扩容,则新size为第一个大于等于dict.ht[0].used + 1的2^n
    2. 如果是收缩,则新size为第一个大于等于dict.ht[0].used的2^n (不得小于4)
  2. 按照新的realeSize申请内存空间,创建dictht,并赋值给dict.ht[1]。让dict字典同时持有 ht[0] 和 ht[1] 两个哈希表。
  3. 设置dict.rehashidx = 0,标示开始rehash

可以把rehashidx理解成 进行 渐进式 Rehash 时的“进度条”

  1. 将dict.ht[0]中的每一个dictEntry都rehash到dict.ht[1]
  2. 在rehash进行期间,每次对字典执行添加、删除、查找或者更新操作时,会先检查dict.rehashidx是否大于-1,然后程序除了执行指定的操作以外,还会顺带将ht[0]哈希表在 rehashidx索引(table[rehashidx]桶上的链表)上的所有键值对rehash到ht[1]上,当rehash工作完成之后,将rehashidx属性的值增一,表示下一次要迁移链表所在桶的位置。直到dict.ht[0]的所有数据都rehash到dict.ht[1]
  3. 将dict.ht[1]赋值给dict.ht[0],给dict.ht[1]初始化为空哈希表,释放原来的dict.ht[0]的内存
  4. **将rehashidx赋值为-1,代表rehash结束
  5. 在rehash过程中,新增操作,则直接写入ht[1],查询、修改和删除则会在dict.ht[0]和dict.ht[1]依次查找并执行。这样可以确保ht[0]的数据只减不增,随着rehash最终为空**


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:43:28

web3作业

【Web第三周】『12.9-12.14』 初步了解数据库(MySQL)初步了解sql注入漏洞练习sql语句搭建sql靶场 初步了解数据库(MySQL) 一、MySQL 基础认知 1. 什么是 MySQL? 一款开源的关系型数据库管理系统(RDBMS&…

作者头像 李华
网站建设 2026/4/22 13:27:54

vue基于Spring Boot的高校后勤报修管理系统的应用和研究_49k47q71

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/5/1 6:53:00

手把手玩转Buck变换器控制仿真

buck变换器的simulink开环仿真、电压环闭环仿真,电流环闭环仿真,电压电流环双闭环仿真。 Buck 电路 simulink 仿真 buck 电路 电流开环控制 电流闭环控制闭环控制包括:PID 控制,超前补偿,前馈控制,解耦控制…

作者头像 李华
网站建设 2026/4/27 13:05:40

破局与进化:数字时代下软件测试人才的机遇与挑战

一、行业现状:数字化转型驱动的需求变革 截至2025年底,全球软件测试市场规模已突破600亿美元,中国连续五年保持15%以上的年增长率。随着元宇宙、工业互联网、智能驾驶等新兴领域的爆发式发展,测试需求正呈现三个显著特征&#xf…

作者头像 李华