Redis的字典由 dict.h/dict 结构如下(rehash的重点)

typedef struct dict {//类型特性函数dictType *type;//私有数据void *privdata;//哈希表dictht ht[2];//rehash索引//当rehash没有进行时为-1int trehashidx;
}

ht 属性是一个包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下使用的都是ht[0]的哈希表,而ht[1]的哈希表只会在rehash的时候使用。

随着操作的进行,哈希表中的键值对会逐渐增多或减少,这时为了让哈希表负载因子位置在一个合理的范围之内就会对哈希表大小进行扩展或收缩即rehash。

rehash流程如下:

  • 先为ht[1]的哈希表分配空间(分配的空间取决于要执行的操作以及当前ht[0]哈希表的键值对数量

    • 如果执行的是扩展操作,那么ht[1]哈希表的大小为 第一个大于等于ht[0].used * 2的 2的n次方幂,即第一个大于等于ht[0]哈希表键值对数量两倍的2的n次方幂
    • 如果执行的是 收缩操作,那么ht[1]哈希表的大小为第一个大于等于 ht[0]哈希表键值对数量的2的n次方幂
  • 然后保存在ht[0]哈希表的所有键值对rehash到ht[1]哈希表上,rehash就是重新计算键值对的索引值和哈希值,将键值对放在新哈希表对应的位置上
  • 当ht[0]哈希表上的所有键值对全部迁移到了ht[1]哈希表上后,释放ht[0]空间,将ht[1]设置为ht[0],并在ht[1]创建一个新的空白哈希表为下一次rehash做准备。(有点像JVM幸存者区的from区和to区,也是在每次yong GC之后清空from区,from区和to区交换)

但是Redis的rehash过程不是一次性rehash,而是渐进式rehash

渐进式rehash

就上诉流程而言

  • 在为ht[1]哈希表分配空间之后,现在同时有了 ht[0] 和 ht[1]哈希表
  • 最上方redis的字典结构已经给各位展示,其中有个 int 类型变量 trehashidx 表示着渐进式rehash的一个索引计数器
  • 在rehash进行期间,每次对字典进行增删改查的操作,除了完成对应的操作之外,还会将ht[0]哈希表上与 trehashidx 对应索引上的键值对 rehash 到ht[1]哈希表上,当此次rehash完成之后将 trehashidx 加一
  • 最后当ht[0]哈希表上的所有键值对都rehash到ht[1]哈希表上了之后,会将trehashidx 设置为 -1,表示rehash已经完成。

注意:

  • 渐进式rehash的过程中,对于字典的删除、查找、修改都现在 ht[0]哈希表上进行,没有的话就去ht[1]哈希表上
    但是对于增加操作的话,则是直接在ht[1]哈希表上进行,这样的话能确保ht[0]哈希表的键值对数量只会减少,最终随着rehash的完成是ht[0]哈希表变为空表。

最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~

分享大纲

大厂面试题专栏

Java从入门到入坟学习路线目录索引

开源爬虫实例教程目录索引

更多精彩内容分享,请点击 Hello World (●’◡’●)


【Redis高频面试题系列】:说说Redis的rehash过程相关推荐

  1. Redis高频面试题汇总(2021最新版)

        本文已收录于专栏 ⭐️<Redis面试题汇总--2021最新版本>⭐️ 上千人点赞收藏,全套Redis高频面试题,大厂必备技能! 面试官心理分析 从面试官的角度分析,出这道题的目的 ...

  2. Redis高频面试题完整版

    文章目录: Redis概述 什么是Redis? Redis的优缺点? Redis为什么常常用做缓存?相比于guava有什么优势? Redis和Memcached的区别与共同点? Redis是单线程还是 ...

  3. redis key失效的事件_《分享几道高频 Redis 高频面试题,面试不用愁》

    1.说说 Redis 都有哪些应用场景? 缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力. 共享Ses ...

  4. Redis高频面试题(2023最新)

    目录 前言 1.redis是什么 2.redis的存储结构有哪些 3.为什么要用redis和redis为什么那么快 4.缓存雪崩.缓存穿透.缓存击穿 5.redis的持久机制 6.redis的过期策略 ...

  5. Redis高频面试题汇总(下)

    目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey? 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中 ...

  6. redis常见面试题有哪些?redis集群面试题及答案整理

    下面要给大家带来的是一整套的redis集群面试题,包含了具体的面试题目和答案,想要来看这方面面试题的小伙伴可以来了解一下. 一.面试题及答案 1.Redis有哪些适合的场景? (1)Session共享 ...

  7. 计算机网络高频面试题最新版

    在秋招过程中看了大量面经,将常见的计算机网络面试题总结如下,并按照面试中提问的频率做了标注(星数越高,面试中提问频率越高),如有帮到你,可以收藏点赞支持哦. 微信搜索公众号路人zhang,回复面试手册 ...

  8. 数据库索引高频面试题(最新版)

    MySQL的索引是面试中的高频题目,将常见的索引面试题目总结了一下,如果有帮到你可以点赞收藏呦. 微信搜索公众号路人zhang,回复面试手册,领取更多高频面试题PDF版及更多面试资料. 面试手册在线版 ...

  9. MySQL高频面试题(最新版)

    MySQL高频面试题,题目后面的星数越高,在面试中越高频 微信搜索公众号路人zhang,回复面试手册,领取更多高频面试题PDF版及更多面试资料. 面试手册在线版: www.mianshi.online ...

最新文章

  1. 在CentOS 6.8 x86_64上安装ATS 6.2.1实录
  2. Windows 11 预览版泄露!有 macOS 那味儿了......
  3. MVVM架构~knockoutjs系列之为validation.js扩展minLength和maxLength
  4. VMware虚拟机直连物理网络的两种方式
  5. LeetCode Two Sum III - Data structure design
  6. worktools-源码下拉问题
  7. git 配置命令行别名
  8. 封装一个Array 数据 绑定 html select 方法
  9. 图册图册图册图册图册图册
  10. python expect_python--pexpect
  11. qt中设置父窗口中某一控件样式后,子窗口中某一控件也随父控件样式
  12. Java只读服务器,在服务器端,JSP页面如何只读打开本地的word文件并显示在网页上...
  13. DPM 检测源码分析
  14. javascript二维数组
  15. echarts中矢量图片路径设置
  16. ValueError: Cannot feed value of shape (784,) for Tensor 'Placeholder:0', which has shape '(?, 784)'
  17. 深度学习中的9种归一化方法概述
  18. Redis(九)-Redis的常用数据类型之Hash表
  19. c语言 pow算圆的面积,简单微积分--积分求圆的面积
  20. K8s(资源管理,namespace,Pod)

热门文章

  1. 竞品分析5步法教你如何分析竞争对手网站
  2. 云迁移实践:VMware虚拟机迁移到OpenStack
  3. Windows高效办公之批量创建文件夹
  4. laydate设置min为今天
  5. 德语环境下 小数点格式化时数字格式异常问题
  6. 达梦数据库(DM8)DCA培训及认证考试有感--附ODBC使用新场景
  7. 如何在eLance,oDesk或Guru.com等外包平台上赢得任何项目?
  8. Unity3D IDE安装执行过程
  9. 鸿蒙历程及路标,关于鸿蒙历程的那些路标:鸿蒙OS有备而来
  10. asm路径出现DB_UNKNOWN