通俗详解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就是“蚂蚁搬家”,把大任务拆成小步骤,边服务边迁移,既保证速度,又不影响用户体验。这下明白了吧?👨💻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 FPGA的HLS技术与应用

1、hls简介 HLS ( high level synthesis )即高层次综合,主要是利用高级编程语言实现算法。 2、循环优化 绝大多数循环都以串行的方式执行,这种执行方式比较浪费时间。对于串行的循环有两种优化方式,转为 并行( Unrol…

Kafka consumer_offsets 主题深度剖析

Kafka consumer_offsets 主题深度剖析 在 Apache Kafka 的消息消费机制中,确保消息被可靠消费是一个核心问题。为了解决这个问题,Kafka 设计了一个特殊的内部主题 consumer_offsets,用于跟踪和管理消费者组的消费进度。 consumer_offsets 的…

基于javaweb的SpringBoot时装购物系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

B站pwn教程笔记-5

复习和回顾 首先复习一下ELF文件在内存和磁盘中的不同。内存只关注读写这权限,会合并一些代码段。 动态链接库只在内存中单独装在一份 因为很多软件都要用动态链接库了,不可能一个个单独复制一份。但是在有的调试环境下会单独显示出来各一份。 ld.so是装…

云原生网络拓扑:服务网格的量子纠缠效应

引言:数据平面的虫洞跃迁 谷歌服务网格每日处理5万亿请求,Istio 1.20版本时延降低至0.8ms。蚂蚁集团Mesh架构节省42%CPU开销,AWS App Mesh实现100ms跨区故障切换。LinkedIn Envoy配置规则达1200万条,腾讯云API网关QPS突破900万。…

爬虫——playwright获取亚马逊数据

目录 playwright简介使用playwright初窥亚马逊安装playwright打开亚马逊页面 搞数据搜索修改bug数据获取翻页优化结构 简单保存 playwright简介 playwright是微软新出的一个测试工具,与selenium类似,不过与selenium比起来还是有其自身的优势的&#xff…

Matrix-Breakout-2-Morpheus靶场通关心得:技巧与经验分享

1.安装靶机,并在虚拟机打开,确保和kali在同一个NAT网段 2.使用kali来确定该靶机的IP nmap -O 192.168.139.1/24 3.访问该IP192.168.139.171 4.访问robots.txt 5.扫描目录 gobuster dir -u http://192.168.139.171 -x php,bak,txt,html -w /usr/share/d…

机器学习扫盲系列(2)- 深入浅出“反向传播”-1

系列文章目录 机器学习扫盲系列(1)- 序 机器学习扫盲系列(2)- 深入浅出“反向传播”-1 文章目录 前言一、神经网络的本质二、线性问题解析解的不可行性梯度下降与随机梯度下降链式法则 三、非线性问题激活函数 前言 反向传播(Ba…

(一)飞行器的姿态欧拉角, 欧拉旋转, 完全数学推导(基于坐标基的变换矩阵).(偏航角,俯仰角,横滚角)

(这篇写的全是基矢变换矩阵)不是坐标变换矩阵,坐标变换矩阵的话转置一下,之后会有推导. 是通过M转置变换到P撇点.

C语言和C++到底有什么关系?

C 读作“C 加加”,是“C Plus Plus”的简称。 顾名思义,C 就是在 C 语言的基础上增加了新特性,玩出了新花样,所以才说“Plus”,就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的关系。 C 语言是 1972 年由美国贝…

PCB画图软件PROTEL99SE学习-05画出铜箔来

sch设计的是各个器件的电连接。设计的就是各种节点的网络表关系。不管你器件怎么摆放,好看不好看。都不重要。最终设计电路板是把网络表中连线的网络节点都用铜箔实物相连,让他们导电。 网表导出后我们不用去看他,也不用管他的格式。 我们打开…

helm部署metricbeat

背景 在Elastic Stack 7.5版本之前,系统默认采用内置服务进行监控数据采集(称为内部收集机制),这种设计存在显著局限性: 当ES集群崩溃时自带的节点监控也会随之崩溃,直到集群恢复前,崩溃期间的…

【菜鸟飞】AI多模态:vsCode下python访问阿里云通义文生图API

目标 有很多多模态的AI工具,用的少就用在线图形化的,需要批量,就尝试代码生成,本文尝试代码调用多模态AI,阿里通义有免费额度,作为练手应该挺好,如果以后选其他的,技术也是相通的。…

从零实现本地文生图部署(Stable Diffusion)

1. 依赖安装 文件打包下载地址(Stable Diffusion) # git : 用于下载源码 https://git-scm.com/downloads/win # Python 作为基础编译环境 https://www.python.org/downloads/ # Nvidia 驱动,用于编译使用GPU显卡硬件 https://ww…

缓存监控治理在游戏业务的实践和探索

作者:来自 vivo 互联网服务器团队- Wang Zhi 通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。 一、缓存监控的背景 游戏业务中存在大量的高频请求尤其是对热门游戏而言,而应对高并发场景缓存是一个常见且有效的手段。 游戏业…

WordPress漏洞

一,后台修改模板拿WebShell 1,安装好靶场后访问 2,在如图所示的位置选择一个php文件写入一句话木马,我们这里选择在404.php中写入 3,访问404.php 二,上传主题拿WebShell 1,找到如图所示的页面…

【Linux系列】实时监控磁盘空间:`watch -n 1 ‘df -h‘` 命令详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践

项目背景与发展历程 在金融科技快速发展的今天,股票分析作为投资决策的核心环节,正面临数据量激增和复杂性提升的挑战。传统股票分析依赖人工处理,效率低下且成本高昂,而人工智能(AI)的引入为这一领域带来…

llama源码学习·model.py[3]ROPE旋转位置编码(4)ROPE的应用

一、源码注释 def apply_rotary_emb(xq: torch.Tensor, # 查询矩阵xk: torch.Tensor, # 键矩阵freqs_cis: torch.Tensor, # 旋转嵌入 ) -> Tuple[torch.Tensor, torch.Tensor]:# 首先将xq和xk张量转换为浮点数# 然后使用reshape将最后一个维度拆分为两个维度,每…

dify重磅升级:从0.15.3安全升级1.1.0新手避坑指南

Docker Compose 部署 备份自定义的 docker-compose YAML 文件(可选) cd docker cp docker-compose.yaml docker-compose.yaml.-$(date +%Y-%m-%d-%H-%M).bak从 main 分支获取最新代码 git checkout main git pull origin main停止服务,命令,请在 docker 目录下执行