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

redis的哈希扩容

Redis 哈希的扩容过程是其高效性的关键所在,它采用了一种非常巧妙的渐进式 rehash 策略来避免一次性扩容带来的服务停顿。

步骤 1:准备工作

当满足扩容条件时,为 ht[1] 分配空间。新的大小根据上述规则计算。
将字典的 rehashidx 属性从 -1 设置为 0。这个设置标志着 rehash 过程的正式开始。

步骤 2:执行过程(逐步迁移)

在 rehashidx 被设置为 0 之后,每次对字典进行增、删、改、查操作时,Redis 除了执行指定的操作外,还会顺带进行以下“额外工作”:迁移一个桶:在 ht[0] 的 table[rehashidx] 位置(即第 rehashidx 个桶)上,将这个桶里的所有键值对(包括因哈希冲突形成的链表)重新计算哈希值,并放到 ht[1] 的对应新位置上。

更新索引:将 ht[0].table[rehashidx] 设置为空。

递增索引:将 rehashidx 属性的值加一(rehashidx++)。

步骤 3:结束过程

当 rehashidx 递增到等于 ht[0].size 时,意味着 ht[0] 的所有桶都已经迁移完毕。

此时,释放 ht[0] 的空间。

将 ht[1] 设置为新的 ht[0]。

为 ht[1] 创建一个新的空白哈希表,为下一次 rehash 做准备。

将 rehashidx 再次设置为 -1,标志着 rehash 过程彻底结束。

四、在此期间的操作如何执行?

由于数据分布在两个表中,所以在此期间的所有操作都需要在两个表中进行:

查找(GET):程序会先到 ht[0] 中查找,如果没找到,再到 ht[1] 中查找。

添加(SET):新的键值对会一律被保存到 ht[1] 中,这保证了 ht[0] 的键值对数量只减不增,最终会变成空表。

删除(DEL)和 更新:会同时作用于 ht[0] 和 ht[1]。

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

相关文章:

  • vite tailwindcss配置
  • window系统下使用二进制包安装MySQL数据库
  • 在Vona ORM中实现多数据库/多数据源
  • sql over()函数使用
  • 小柏实战学习Liunx(图文教程三十二)
  • Git回退版本 reset、revert、read-tree、restore
  • 详细介绍:LeetCode 240. 搜索二维矩阵 II
  • Avalonia 背景颜色Transparent在用户界面设计中对悬浮效果影响的总结
  • 飞书 燕千云焕新上线,飞书用户即刻试用ITSM工具
  • 如果使用微软 Azure 托管的 OpenAI 服务
  • Alibaba Cloud Linux与 RHEL/CentOS版本对应关系 - 实践
  • OpenCV:人脸识别实战,3 种算法(LBPH/EigenFaces/FisherFaces)代码详解 - 实践
  • 深入解析:Playwright录制时的高亮实现机制分析
  • 什么是文件外发审批?主要有哪几种关键流程?
  • VPX处理板设计原理图:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡 C6678板卡, XC7VX690T板卡, VPX处理板
  • Python入门—Mac如何搭建Python开发环境?
  • VitePress 添加友链界面
  • 跨网文件摆渡软件:企业数据安全高效传输的关键解决方案!
  • 洛谷题单指南-进阶数论-P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
  • 第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(4、充电站) - 指南
  • 界面控件DevExpress WinForms中文教程:Data Grid - 搜索/查找面板
  • c语言之自定义memcpy
  • 国产芯片处理板卡:7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡
  • 一文详解纷享销客CRM Agent平台3大核心能力(附应用场景与案例)
  • QOJ #5076. Prof. Pang and Ants 题解
  • 微信小程序(uniapp)PDF预览完整实现方案
  • 发现5个宝藏文件摆渡系统 2025年企业首选的摆渡方案是这个!
  • BilldDesk:基于Vue3+WebRTC+Nodejs+Electron的开源远程桌面控制 - 详解
  • css-轮播图效果
  • aspnetcore使用websocket实时更新商品信息