衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

redis hash底層實現原理

科技綠洲 ? 來源:網絡整理 ? 作者:網絡整理 ? 2023-12-04 16:27 ? 次閱讀

Redis是一個開源的內存數據庫,使用鍵值對存儲數據。其中,Redis中的數據結構之一就是哈希(Hash),它提供了一種將多個字段(Field)存儲在一個鍵(Key)中的方法。那么Redis的哈希數據結構是如何實現的呢?本文將詳細介紹Redis哈希底層的實現原理。

在Redis中,每個哈希都是由一個類似于字典(Dictionary)的結構實現的,其中使用鏈地址法解決哈希沖突。整個哈希表的結構如下所示:

typedef struct dict {
dictType *type;
void *privdata;
dictht ht[2];
int rehashidx; /* rehashing 進度標識,當進行漸進式rehash時,這個值表示目前操作的(ht[0]或者ht[1])桶的索引位置*/
int iterators; /* number of iterators currently running 哈希表上目前運行的迭代器數量*/
} dict;
typedef struct dictht {
dictEntry **table; /* 哈希表數組,每個元素都是指向dictEntry結構的指針(指針數組) */
unsigned long size; /* 哈希表大小,是桶數,不能大于2^32 */
unsigned long sizemask; /* 哈希表大小掩碼,用于計算索引值,等于size-1,位運算提高性能 */
unsigned long used; /* 哈希表已有節點數量 */
} dictht;
typedef struct dictEntry {
void *key;
union {
void *val;
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next; /* 鏈地址法解決沖突 */
} dictEntry;

上述代碼中的dict結構表示一個哈希表,其中ht[0]表示當前哈希表,ht[1]表示進行漸進式rehash時的輔助哈希表(當需要對哈希表進行擴容時,會使用輔助哈希表提前申請新的內存)。

dictht結構表示哈希表內部的哈希數組,table是一個指針數組,將哈希桶中的元素以鏈表的形式進行存儲。

對于每個哈希鍵值對,Redis使用dictEntry結構來表示,其中key是一個指向鍵的指針,v是一個聯合體,可以存儲不同類型的值(Redis值對象),例如整型、浮點型、字符串等。

具體來說,Redis哈希底層實現的步驟如下:

  1. 根據鍵值對的鍵,通過哈希函數計算出哈希值。
  2. 根據哈希值計算出存儲位置(索引)。
  3. 在哈希表中找到對應索引位置的哈希桶(鏈表),然后遍歷整個鏈表,查找是否有相同鍵的節點。
  4. 如果找到相同鍵的節點,根據操作類型進行更新或刪除操作。
  5. 如果沒有找到相同鍵的節點,則創建新的節點并將其插入到鏈表中。

下面是哈希表的插入、查找、刪除的具體實現細節:

  1. 插入:首先通過哈希函數將鍵轉換為哈希值,并計算出插入位置。然后,查詢該位置對應的哈希桶,遍歷鏈表,查找是否已經存在相同的鍵。如果存在相同鍵,則更新對應節點的值。如果不存在相同鍵,則創建新的節點并將其插入到鏈表首部。如果鏈表長度過長(超過一定閾值),則將鏈表轉化為紅黑樹(時間復雜度由O(n)降低為O(log n))。
  2. 查找:通過哈希函數計算鍵對應的哈希值,然后在哈希表中查找對應索引的哈希桶。遍歷鏈表,查找是否存在相同鍵的節點。如果存在,則返回節點的值;如果不存在,則返回空指針。
  3. 刪除:通過哈希函數計算鍵對應的哈希值,然后在哈希表中查找對應索引的哈希桶。遍歷鏈表,查找是否存在相同鍵的節點。如果存在,則刪除該節點,并釋放其內存;如果不存在,則不進行任何操作。

需要注意的是,在Redis中,哈希表的擴容和縮容是通過漸進式rehash來實現的。漸進式rehash的過程分為兩個階段,首先,Redis會在擴容時創建一個新的輔助哈希表(ht[1]),然后將原有哈希表(ht[0])中的節點逐個遷移到輔助哈希表中。在這個過程中,Redis會通過rehashidx來標識當前操作的桶的索引位置。當遷移完成后,Redis會停止對ht[0]的操作,并釋放其內存。

綜上所述,Redis的哈希底層實現主要是基于字典結構和鏈地址法解決哈希沖突的思想。通過哈希函數計算鍵對應的哈希值,并在哈希表中查找對應的哈希桶。通過遍歷鏈表或者紅黑樹,實現插入、查找和刪除等操作。此外,Redis還使用漸進式rehash來實現哈希表的擴容和縮容。通過這些實現,Redis的哈希數據結構能夠高效地存儲和操作大量的鍵值對數據。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74332
  • 數據庫
    +關注

    關注

    7

    文章

    3846

    瀏覽量

    64686
  • Hash
    +關注

    關注

    0

    文章

    32

    瀏覽量

    13251
  • Redis
    +關注

    關注

    0

    文章

    378

    瀏覽量

    10944
收藏 人收藏

    評論

    相關推薦

    hash表的實現原理

    軟件開發中,一個hash表相當于把n個key隨機放入到b個bucket中,以實現n個數據在b個單位空間的存儲。 我們發現hash表中存在一些有趣現象: hash表中key的分布規律 當
    發表于 09-28 14:31 ?0次下載
    <b class='flag-5'>hash</b>表的<b class='flag-5'>實現</b>原理

    Redis基本類型和底層實現

    簡單介紹了Redis的五種對象類型和它們的底層實現。事實上,Redis的高效性和靈活性正是得益于對于同一個對象類型采取不同的底層結構,并在必
    發表于 11-25 15:11 ?4510次閱讀
    <b class='flag-5'>Redis</b>基本類型和<b class='flag-5'>底層</b><b class='flag-5'>實現</b>

    redis快速入門詳解

    本文下詳細匯總了有關于redis知識點。redis是一個開源的key-value數據庫。它又經常被認為是一個數據結構服務器。因為它的value不僅包括基本的string類型還有list,set ,sorted set和hash
    的頭像 發表于 02-09 11:32 ?3434次閱讀

    Redis五種常見對象類型的底層數據結構

    集合(Zset),我們在日常工作中也會經常使用它們。知其然,更要知其所以然,本文將會帶你讀懂這五種常見對象類型的底層數據結構。 本文主要內容參考自《Redis設計與實現》 1. 對象類型和編碼
    的頭像 發表于 11-14 09:50 ?3076次閱讀
    <b class='flag-5'>Redis</b>五種常見對象類型的<b class='flag-5'>底層</b>數據結構

    Springboot+redis操作多種實現

    一、Jedis,Redisson,Lettuce三者的區別共同點:都提供了基于Redis操作的Java API,只是封裝程度,具體實現稍有不同。 不同點: 1.1、Jedis 是Redis的Java
    的頭像 發表于 09-22 10:48 ?1871次閱讀
    Springboot+<b class='flag-5'>redis</b>操作多種<b class='flag-5'>實現</b>

    Redis實現限流的三種方式分享

    當然,限流有許多種實現的方式,Redis具有很強大的功能,我用Redis實踐了三種的實現方式,可以較為簡單的實現其方式。
    的頭像 發表于 02-22 09:52 ?1134次閱讀

    hash算法在FPGA中的實現(1)

    在FPGA的設計中,尤其是在通信領域,經常會遇到hash算法的實現hash算法在FPGA的設計中,它主要包括2個部分,第一個就是如何選擇一個好的hash函數,減少碰撞;第二個就是如何
    的頭像 發表于 09-07 17:01 ?1377次閱讀
    <b class='flag-5'>hash</b>算法在FPGA中的<b class='flag-5'>實現</b>(1)

    hash算法在FPGA中的實現(2)

    在前面的文章中:hash算法在FPGA中的實現(一)——hash表的組建,記錄了關于hash表的構建,這里記錄另外一個話題,就是hash鏈表
    的頭像 發表于 09-07 17:02 ?973次閱讀
    <b class='flag-5'>hash</b>算法在FPGA中的<b class='flag-5'>實現</b>(2)

    Redis的數據類型有哪些

    Redis的數據類型有哪些?有五種常用數據類型:String、Hash、Set、List、SortedSet。以及三種特殊的數據類型:Bitmap、HyperLogLog、Geospatial
    的頭像 發表于 10-09 10:51 ?848次閱讀

    Redis底層數據類型

    1. 前言 Redis的鍵值對中的常見數據類型有String (字符串)、List(列表)、Hash(哈希)、Set(集合)、Zset(有序集合)。那么其對應的底層數據結構有SDS(simple
    的頭像 發表于 10-09 14:05 ?436次閱讀
    <b class='flag-5'>Redis</b><b class='flag-5'>底層</b>數據類型

    redis的五種數據類型底層數據結構

    Redis是一種內存數據存儲系統,支持多種數據結構。這些數據結構不僅可以滿足常見的存儲需求,還能夠通過其底層數據結構提供高效的操作和查詢。以下是Redis中常用的五種數據類型及其底層
    的頭像 發表于 11-16 11:18 ?746次閱讀

    Redis工具集的實現和使用

    Redis 基本上是互聯網公司必備的工具了,Redis的應用場景實在太多了,但是有很多相似的功能如果每個項目都要實現一遍就顯得太麻煩了,所以為了方便,我打算開發一個基于 Redis
    的頭像 發表于 12-03 17:32 ?1286次閱讀
    <b class='flag-5'>Redis</b>工具集的<b class='flag-5'>實現</b>和使用

    redis集群中的hash一致性算法的理解

    的單節點Redis已經無法滿足高并發讀寫和大容量存儲的需求。為了解決這個問題,Redis集群應運而生。 Redis集群通過將數據分散到多個節點上,實現了水平擴展,使得
    的頭像 發表于 12-04 10:45 ?794次閱讀

    Java redis鎖怎么實現

    在Java中實現Redis鎖涉及到以下幾個方面:Redis的安裝配置、Redis連接池的使用、Redis數據結構的選擇、
    的頭像 發表于 12-04 10:47 ?1214次閱讀

    redis數據結構的底層實現

    Redis是一種內存鍵值數據庫,常用于緩存、消息隊列、實時數據分析等場景。它的高性能得益于其精心設計的數據結構和底層實現。本文將詳細介紹Redis常用的數據結構和它們的
    的頭像 發表于 12-05 10:14 ?665次閱讀
    皇朝娱乐城| 大发888娱乐场下载samplingid112 | 大发888官方指定| 太阳城棋牌| 百家乐官网手机软件| 百家乐官网必胜课| 手机百家乐官网的玩法技巧和规则| 大桥下做生意风水好吗| 网上百家乐骗钱| 大发888娱乐博盈投资| 百家乐| 赌博百家乐官网探讨| 百家乐路单用处| 24山吉凶图| 博必发百家乐的玩法技巧和规则| 德州扑克辅助软件| 百家乐官网庄闲和概率| 博彩网百家乐官网的玩法技巧和规则 | 百家乐视频聊天游戏| 富二代百家乐的玩法技巧和规则| 新利国际娱乐网| 三公百家乐官网玩法| 百家乐和抽水官网| 大发888游戏官方下载客户端 | 百家乐官网连锁| 真人百家乐做假| 盈丰| 游戏机百家乐官网下载| 百家乐生活馆| 太阳城网上投注| 百家乐官网龙虎台布价格| 百家乐大转轮| a8娱乐城线上娱乐| 百家乐官网赌场国际| 24山72向水口吉凶断| 大发888在线娱乐城合作伙伴| 蓝盾百家乐官网赌场| 百家乐桌子北京| 六合彩136| 金彩百家乐官网的玩法技巧和规则| 百家乐群|