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

通俗详解redis底层数据结构哈希表之渐进式rehash

一、为什么要用渐进式rehash?

假设你家的旧柜子(哈希表)装满了,需要换个大柜子。如果一次性把所有东西倒腾到新柜子,你可能得停下手头所有事,累得半死(这就是传统rehash的问题:卡顿)。Redis为了不“累死”,选择边搬边用,每次搬一点,这就是“渐进式”。


二、具体怎么“搬家”?

1️⃣ 先准备好新柜子(分配空间)
• Redis会先申请一个更大的新哈希表(比如旧表两倍大),这时候系统里同时有「旧表」和「新表」。

2️⃣ 贴个标签记录搬到哪里了(rehashidx)
• 用一个标记rehashidx​(类似搬家进度条),初始设为0,表示从旧表的第0个位置开始搬。

3️⃣ 边干活边搬东西(每次操作顺带迁移)
• 每次有人来查、改、删数据时,Redis除了干活,还会顺手把旧表当前进度条位置的数据搬到新表。比如你查了个数据,Redis搬完旧表第0个位置的数据后,把rehashidx​+1,下次搬第1个位置。

4️⃣ 偷偷加班搬(定时任务辅助)
• 如果一直没人操作,Redis也会自己开个“定时任务”,每次最多搬1毫秒,防止彻底摆烂。

5️⃣ 搬完收尾(释放旧表)
• 等旧表全搬空了,就把旧表扔掉,新表改名叫“旧表”,等待下次扩容。


三、搬家期间怎么保证正常使用?

• 查数据:先翻旧柜子,找不到再去新柜子找(两边都查)。
• 新增数据:直接扔到新柜子,旧柜子不再放新东西(保证旧柜子越来越空)。
• 删/改数据:两个柜子都要操作,比如删旧柜子的数据,新柜子有的话也得删。


四、这样做有啥好处?

  1. 不卡顿:分摊搬家压力,用户无感知。
  2. 内存可控:旧柜子只减不增,不会无限膨胀。
  3. 平滑过渡:就像一边开车一边换轮胎,服务不中断。

举个栗子🌰

假设旧表有4个位置(0~3),现在要搬到8个位置的新表:
• 第1次有人查数据,Redis搬完位置0的数据,rehashidx​变成1。
• 第2次有人删数据,顺手搬位置1的数据,rehashidx​变成2。
• 搬完位置3后,旧表清空,换上新表,搬家完成!


总结:渐进式rehash就是“蚂蚁搬家”,把大任务拆成小步骤,边服务边迁移,既保证速度,又不影响用户体验。这下明白了吧?👨💻

相关文章:

  • Windows10配置OpenJDK11
  • VSCode下载安装指南
  • 零、ubuntu20.04 安装 anaconda
  • 建模中的特征衍生技巧总结(含各类常用衍生函数)
  • kali,NTFS,用户管理,文件共享,本地安全策略,计算机基础
  • OpenCV 其他模块使用指南
  • C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革
  • dart学习记录5(类、对象)
  • 练习-班级活动(map存储键值对)
  • hexo+butterfly博客功能完善和美化(三)---评论功能载入
  • Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测
  • 爱普生晶振FC2012AA汽车ADAS主控制系统的理想选择
  • 代码随想录刷题day50|(回溯算法篇)131.分割回文串▲
  • zephyr-中国跨国并购数据(1997-2024.3.8)
  • C# System.Text.Encoding 使用详解
  • 支持向量机(SVM):从入门到精通的机器学习利器
  • 多模态大模型常见问题
  • 模型整合-cherry studio+mysql_mcp_server服务配置
  • Flink实战教程从入门到精通(基础篇)(一)Flink简介
  • 从PGC到AIGC:海螺AI多模态内容生成系统架构一站式剖析
  • 特朗普指控FBI前局长“暗示刺杀总统”,“8647”藏着什么玄机?
  • 病愈出院、跳大神消灾也办酒,新华每日电讯:农村滥办酒席何时休
  • 贞丰古城:新垣旧梦间的商脉与烟火
  • 俄乌官员即将在土耳其会谈,外交部:支持俄乌开启直接对话
  • 自强!助残!全国200个集体和260名个人受到表彰
  • 上海高院与上海妇联签协议,建立反家暴常态化联动协作机制