当前位置: 首页 > news >正文

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最终为空**


http://www.jsqmd.com/news/89050/

相关文章:

  • 记一次服务器异常宕机导致的系统异常
  • 计算机考研408【计算机网络】核心知识点总结
  • 2025年新生儿纸尿裤深度评测报告:基于多维度的TOP5品牌推荐指南 - 速递信息
  • 文理无界,全维适配——清北道远学习机的学科赋能之道
  • like关联改写
  • 中国板材品牌哪家好?亦木良品,环保板材/全屋定制板材/装修环保板材/衣柜专用板材/桦木板/FOSB板/橡胶木/多层板/颗粒板定制实力厂家,老牌子,质量稳定性价比高 - 全局中转站
  • 打开软件出现找不到vfp9rchs.dll文件 丢失的情况 下载修复
  • 当Adaboost遇上SVM:时间序列预测的另类打开方式
  • Windows系统文件vsstrace.dll缺少损坏问题 下载修复
  • Windows系统文件wavemsp.dll丢失或损坏的问题 下载修复
  • vue基于Spring Boot的宠物服务平台的应用和研究_3by8b8n8
  • 陪诊陪护小程序|上门打针|院内陪护|陪诊跑腿服务
  • 破局与进化:数字时代下软件测试人才的机遇与挑战
  • JVM 调优的尽头是 AI?我把 GC 日志喂给 DeepSeek,它给出的参数配置让我惊呆了
  • 在晶体塑性有限元模拟中,批量写入晶粒的取向和材料参数是一个常见但繁琐的任务。今天,我们就来聊聊如何用Python脚本自动化这个过程,省去手动输入的麻烦
  • vue基于Spring Boot的宠物领养救助网站 志愿者28170q8a
  • DevOps中的测试文化构建:从工具到思维的全面转型
  • 生物识别系统的测试安全性与漏洞防护实践
  • 智能测试指标动态权重分配研究
  • 量子算法的测试验证挑战:软件测试从业者的新战场
  • MAUI库推荐一:MAUIIcons
  • 基于单片机的酒驾报警刹车系统设计
  • 考研408--数据结构--day2--顺序表及其增删改查 - 指南
  • 强化学习Sarsa求最优策略
  • 基于单片机的PID调节脉动真空灭菌器上位机远程监控设计
  • JS 加密绕过大杀器!SpiderX 自动化工具横空出世,安全人直接封神
  • 【time-rs】time库 ComponentRange 错误类型详解(error/component_range.rs)
  • 一文详解Java中Thread、ThreadGroup 和 ThreadLocal<T> 三者的区别和用途
  • 基于单片机的安全带长度高度拉力监测与自动锁紧控制系统设计
  • std::promise 重难点