通俗詳解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.pswp.cn/web/72900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72900.shtml
英文地址,請注明出處:http://en.pswp.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 目錄下執行