redis hashtable 的sizemask理解

在 Redis 的哈希表實現中,index = hash & dict->ht[0].sizemask 是計算鍵值對應存儲位置的核心操作。這個操作看起來簡單,但背后涉及哈希表的內存布局和性能優化策略。我們通過以下步驟逐步解析其原理:


一、哈希表的設計目標

  1. 快速定位桶(Bucket):通過鍵的哈希值直接找到對應的存儲位置,時間復雜度接近 O(1)。
  2. 均勻分布鍵值對:減少哈希沖突,避免鏈表過長導致性能下降。
  3. 高效計算:避免使用耗時的取模運算(%)。

二、哈希表大小(size)的特殊性

Redis 的哈希表大小 size 始終是 2 的冪(如 4, 8, 16, 32 等)。這種設計有兩個關鍵優勢:

  1. 快速計算索引:用位運算(&)替代取模運算(%)。
  2. 均勻分布哈希值:減少哈希沖突的概率。

三、sizemask 的作用

? 定義sizemask = size - 1
? 二進制特征:當 size 是 2 的冪時,sizemask 的二進制形式為全 1。
例如:
? size = 8sizemask = 7 → 二進制 0111
? size = 16sizemask = 15 → 二進制 1111


四、索引計算原理

1. 取模運算的替代方案

傳統哈希索引計算使用取模運算:

index = hash % size; // 例如 hash=10, size=8 → index=2

但取模運算在計算機中效率較低(涉及除法操作)。

2. 位運算優化

size 是 2 的冪時,可以用位運算替代:

index = hash & (size - 1); // 即 hash & sizemask

為什么這等價于取模?
? 因為 size 是 2 的冪,size - 1 的二進制形式為全 1(例如 size=8 對應 sizemask=7,二進制 0111)。
? hash & sizemask 相當于保留哈希值的低 n 位(n = log2(size)),結果范圍是 0 ≤ index < size,與 hash % size 等價。


五、具體示例

假設哈希表大小 size = 8(即 sizemask = 7),哈希值 hash = 10

步驟二進制表示結果
hash = 10101010
sizemask = 701117
hash & sizemask1010 & 0111 = 00102

結果與 10 % 8 = 2 完全一致,但位運算比取模運算快得多。


六、哈希表擴容時的行為

當哈希表需要擴容(例如從 size=8 擴容到 size=16):

  1. sizemask = 15(二進制 1111
  2. 哈希值相同的鍵會分散到更多桶中
    ? 例如原哈希值 10(二進制 1010)在 size=8 時索引為 2
    ? 擴容后 size=16,索引變為 10 & 15 = 10

七、為什么必須保證 size 是 2 的冪?

如果 size 不是 2 的冪,sizemask 的二進制形式將包含 0,導致部分索引永遠無法被映射到。
例如:
? size = 7sizemask = 6(二進制 0110
? 哈希值 5(二進制 0101)→ 0101 & 0110 = 0100(索引 4)
? 哈希值 3(二進制 0011)→ 0011 & 0110 = 0010(索引 2)
? 索引 1、3、5、7 永遠無法被訪問,導致哈希分布不均。


八、性能對比

操作類型指令周期(近似)適用場景
位運算(&1 cycle快速計算
取模運算(%10-20 cycles通用計算

在 Redis 這種高性能場景下,位運算的優勢顯著。


九、總結

? sizemask = size - 1:當 size 是 2 的冪時,此公式成立。
? hash & sizemask:快速計算鍵的存儲位置,避免取模運算。
? 設計優勢:內存對齊、哈希均勻、計算高效。

這種設計是 Redis 哈希表高性能的核心保障,結合漸進式 rehash 機制,使得 Redis 能夠高效處理大規模鍵值對存儲。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899559.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ruby 命令行選項

Ruby 命令行選項 概述 Ruby 是一種廣泛使用的編程語言,它擁有強大的命令行工具,可以幫助開發者進行各種任務。了解 Ruby 的命令行選項對于提高開發效率至關重要。本文將詳細介紹 Ruby 的常用命令行選項,幫助開發者更好地利用 Ruby 的命令行功能。 Ruby 命令行選項概述 R…

【STM32】WDG看門狗(學習筆記)

學習來源----->江協科技STM32 WDG簡介 WDG&#xff08;Watchdog&#xff09;看門狗看門狗可以監控程序的運行狀態&#xff0c;當程序因為設計漏洞、硬件故障、電磁干擾等原因&#xff0c;出現卡死或跑飛現象時&#xff0c;看門狗能及時復位程序&#xff0c;避免程序陷入長…

Java 數據庫連接池

HikariCP 老外開源的。 Spring Boot 2 之后默認選擇的連接池。 號稱性能最快的數據庫連接池。 為什么性能好呢&#xff1f; ● 字節碼級別的優化-盡量的利用 JIT 的內聯手段 ● 字節碼級別的優化-利用更容易被 JVM 優化的指令 ● 代碼級別的優化-利用改造后的 FastList 代替…

Spring Boot中@Valid 與 @Validated 注解的詳解

Spring Boot中Valid 與 Validated 注解的詳解 引言Valid注解功能介紹使用場景代碼樣例 Validated注解功能介紹使用場景代碼樣例 Valid與Validated的區別結論 引言 在Spring Boot應用中&#xff0c;參數校驗是確保數據完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能擴展說明&#xff1a; 圖類封裝&#xff1a;將圖數據結構封裝為類&#xff0c;提高代碼復用性 最短路徑查找&#xff1a;基于BFS實現未加權圖的最短路徑查找 路徑重構&#xff1a;通過parent數組回溯構建完整路徑 異常處理&#xff1a;當路徑不存在時返回空向量 復雜度分析…

2023第十四屆藍橋杯大賽軟件賽國賽C/C++ 大學 B 組(真題題解)(C++/Java題解)

本來想刷省賽題呢&#xff0c;結果一不小心刷成國賽了 真是個小迷糊〒▽〒 但&#xff0c;又如何( ?? ω ?? )? 記錄刷題的過程、感悟、題解。 希望能幫到&#xff0c;那些與我一同前行的&#xff0c;來自遠方的朋友&#x1f609; 大綱&#xff1a; 一、子2023-&#xff…

CSS學習筆記6——網頁布局

目錄 一、元素的浮動屬性、清除浮動 清除浮動的其他方法 1、使用空標簽清除浮動影響 2、使用overflow屬性清除浮動 3、使用偽元素清除浮動影響 原理 overflow屬性 二、元素的定位 1、相對定位 2、絕對定位 ?編輯 3、固定定位 z-index層疊等級屬性 一、元素的浮動…

sqlalchemy:將mysql切換到OpenGauss

說明 之前python的項目使用的mysql&#xff0c;近期要切換到國產數據庫OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;測試下來發現不用改代碼&#xff0c;只要改下配置即可。 切換方案 安裝openGauss-connector-python-psycopg2 其代碼工程在&#xff1a;https:…

uniapp 獲取dom信息(封裝獲取元素信息工具函數)

在uniapp開發中&#xff0c;需要獲取到dom的信息&#xff0c;需要用到uniapp的指定方式 uni.createSelectorQuery()&#xff0c;但是每次需要用到的時候都需要很長一段的繁瑣代碼&#xff0c;本篇文章將呈現獲取dom信息方法封裝&#xff0c;話不多說&#xff0c;上菜&#xff1…

Linux之數據鏈路層

Linux之數據鏈路層 一.以太網1.1以太網幀格式1.2MAC地址1.3MTU 二.ARP協議2.1ARP協議工作流程2.2ARP協議格式 三.NAT技術四.代理服務4.1正向代理4.2反向代理 五.四大層的學習總結 一.以太網 在我們學習完了網絡層后我們接下來就要進入數據鏈路層的學習了&#xff0c;在學習完網…

MySQL的基礎語法2(函數-字符串函數、數值函數、日期函數和流程函數 )

目錄 一、字符串函數 1.常見字符串函數 ?編輯 2.字符串函數的基本使用 3.字符串函數的數據庫案例演示 二、數值函數 1.常見數值函數&#xff08;如下&#xff09;&#xff1a; 2.數值函數的基本使用 3.數值函數的數據庫案例演示 三、日期函數 1.常見的日期函數 2.日…

全新版租賃商城小程序源碼系統 源碼開源支持二開+圖文搭建教程

在互聯網商業的浪潮中&#xff0c;租賃業務憑借其獨特的優勢&#xff0c;正逐漸成為市場的新寵。對于開發者而言&#xff0c;快速搭建一個功能完備的租賃商城小程序&#xff0c;不僅能滿足市場需求&#xff0c;還能為自己的業務拓展帶來新的機遇。分享一款全新版租賃商城小程序…

Cent OS7+Docker+Dify

由于我之前安裝了Dify v1.0.0&#xff0c;出現了一些問題&#xff1a;無法刪除&#xff0c;包括&#xff1a;知識庫中的文件、應用、智能體、工作流&#xff0c;都無法刪除。現在把服務器初始化&#xff0c;一步步重新安裝&#xff0c;從0到有。 目錄 1、服務器重裝系統和配置…

OSI 七層模型和四層模型(TCP/IP 模型)

文章目錄 前言一、OSI 七層模型二、TCP/IP 四層模型三、運行協議及設備1. OSI 七層模型2. TCP/IP 四層模型3. 運行協議4. 各類設備的作用 總結 前言 OSI 七層模型和四層模型&#xff08;TCP/IP 模型&#xff09;是兩種常見的網絡協議分層架構&#xff0c;它們的主要區別如下&a…

AI的未來:機遇、挑戰與發展方向

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 1. 引言 人工智能&#xff08;AI&#xff09;已經成為當今世界最具革命性的技術之一&#xff0c;它正在深刻改變各個行業&#x…

javascript實現一個函數,將字符串中的指定子串全部替換為另一個字符串的原理,以及多種方法實現。

大白話javascript實現一個函數&#xff0c;將字符串中的指定子串全部替換為另一個字符串的原理&#xff0c;以及多種方法實現。 在JavaScript里&#xff0c;要是你想把字符串里的指定子串都替換成另外一個字符串&#xff0c;有不少方法可以實現。下面我會詳細介紹實現的原理&a…

硬件基礎--16_公式梳理

公式梳理 歐姆定律: IU/R 1.歐姆定律有局限性&#xff0c;僅適用于純電阻電路(或者說純電阻元器件&#xff0c;純電阻設備) 2.純電阻電路:消耗的電能僅轉化為熱能&#xff0c;沒有其他形式的能量轉換。 功率計算:PUI 1.導出公式:PU2 /R 2.導出公式:PI2 R 焦耳定律:QI2 Rt 1.導…

npm i 出現的網絡問題

npm i 出現的網絡問題 解決方案&#xff1a; npm config list 查看.npmrc文件中是否配置了proxy刪除.npmrc文件中的proxy&#xff0c;保存。重新執行npm i命令。 順便說說解決這個問題的心里路程 每次安裝vue的環境的時候&#xff0c;經常遇到npm安裝一些插件或者是依賴的時…

使用vue cli 5.0 在vscode中運行vue命令報錯

1、運行 vue -- version 報錯 2、在cmd 命令行 執行 vue --version 正常 3、在終端中輸入 get-ExecutionPolicy&#xff0c;查看當前權限 4、執行 set-executionpolicy remotesigned 命令設置為可用模式&#xff0c;但是報錯 5、使用管理員打開power shell 執行 G…

瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用筆記

一、源碼 官方在librga中給了很多 demo 以供參考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…