chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

redis hash底層實(shí)現(xiàn)原理

科技綠洲 ? 來源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2023-12-04 16:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Redis是一個(gè)開源的內(nèi)存數(shù)據(jù)庫(kù),使用鍵值對(duì)存儲(chǔ)數(shù)據(jù)。其中,Redis中的數(shù)據(jù)結(jié)構(gòu)之一就是哈希(Hash),它提供了一種將多個(gè)字段(Field)存儲(chǔ)在一個(gè)鍵(Key)中的方法。那么Redis的哈希數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的呢?本文將詳細(xì)介紹Redis哈希底層的實(shí)現(xiàn)原理。

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

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

上述代碼中的dict結(jié)構(gòu)表示一個(gè)哈希表,其中ht[0]表示當(dāng)前哈希表,ht[1]表示進(jìn)行漸進(jìn)式rehash時(shí)的輔助哈希表(當(dāng)需要對(duì)哈希表進(jìn)行擴(kuò)容時(shí),會(huì)使用輔助哈希表提前申請(qǐng)新的內(nèi)存)。

dictht結(jié)構(gòu)表示哈希表內(nèi)部的哈希數(shù)組,table是一個(gè)指針數(shù)組,將哈希桶中的元素以鏈表的形式進(jìn)行存儲(chǔ)。

對(duì)于每個(gè)哈希鍵值對(duì),Redis使用dictEntry結(jié)構(gòu)來表示,其中key是一個(gè)指向鍵的指針,v是一個(gè)聯(lián)合體,可以存儲(chǔ)不同類型的值(Redis值對(duì)象),例如整型、浮點(diǎn)型、字符串等。

具體來說,Redis哈希底層實(shí)現(xiàn)的步驟如下:

  1. 根據(jù)鍵值對(duì)的鍵,通過哈希函數(shù)計(jì)算出哈希值。
  2. 根據(jù)哈希值計(jì)算出存儲(chǔ)位置(索引)。
  3. 在哈希表中找到對(duì)應(yīng)索引位置的哈希桶(鏈表),然后遍歷整個(gè)鏈表,查找是否有相同鍵的節(jié)點(diǎn)。
  4. 如果找到相同鍵的節(jié)點(diǎn),根據(jù)操作類型進(jìn)行更新或刪除操作。
  5. 如果沒有找到相同鍵的節(jié)點(diǎn),則創(chuàng)建新的節(jié)點(diǎn)并將其插入到鏈表中。

下面是哈希表的插入、查找、刪除的具體實(shí)現(xiàn)細(xì)節(jié):

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

需要注意的是,在Redis中,哈希表的擴(kuò)容和縮容是通過漸進(jìn)式rehash來實(shí)現(xiàn)的。漸進(jìn)式rehash的過程分為兩個(gè)階段,首先,Redis會(huì)在擴(kuò)容時(shí)創(chuàng)建一個(gè)新的輔助哈希表(ht[1]),然后將原有哈希表(ht[0])中的節(jié)點(diǎn)逐個(gè)遷移到輔助哈希表中。在這個(gè)過程中,Redis會(huì)通過rehashidx來標(biāo)識(shí)當(dāng)前操作的桶的索引位置。當(dāng)遷移完成后,Redis會(huì)停止對(duì)ht[0]的操作,并釋放其內(nèi)存。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    9

    文章

    3170

    瀏覽量

    76093
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3992

    瀏覽量

    67707
  • Hash
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    13610
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    390

    瀏覽量

    12031
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    hash表的實(shí)現(xiàn)原理

    軟件開發(fā)中,一個(gè)hash表相當(dāng)于把n個(gè)key隨機(jī)放入到b個(gè)bucket中,以實(shí)現(xiàn)n個(gè)數(shù)據(jù)在b個(gè)單位空間的存儲(chǔ)。 我們發(fā)現(xiàn)hash表中存在一些有趣現(xiàn)象: hash表中key的分布規(guī)律 當(dāng)
    發(fā)表于 09-28 14:31 ?0次下載
    <b class='flag-5'>hash</b>表的<b class='flag-5'>實(shí)現(xiàn)</b>原理

    Redis基本類型和底層實(shí)現(xiàn)

    簡(jiǎn)單介紹了Redis的五種對(duì)象類型和它們的底層實(shí)現(xiàn)。事實(shí)上,Redis的高效性和靈活性正是得益于對(duì)于同一個(gè)對(duì)象類型采取不同的底層結(jié)構(gòu),并在必
    發(fā)表于 11-25 15:11 ?5782次閱讀
    <b class='flag-5'>Redis</b>基本類型和<b class='flag-5'>底層</b><b class='flag-5'>實(shí)現(xiàn)</b>

    redis快速入門詳解

    本文下詳細(xì)匯總了有關(guān)于redis知識(shí)點(diǎn)。redis是一個(gè)開源的key-value數(shù)據(jù)庫(kù)。它又經(jīng)常被認(rèn)為是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器。因?yàn)樗膙alue不僅包括基本的string類型還有l(wèi)ist,set ,sorted set和hash
    的頭像 發(fā)表于 02-09 11:32 ?3688次閱讀

    Redis五種常見對(duì)象類型的底層數(shù)據(jù)結(jié)構(gòu)

    集合(Zset),我們?cè)谌粘9ぷ髦幸矔?huì)經(jīng)常使用它們。知其然,更要知其所以然,本文將會(huì)帶你讀懂這五種常見對(duì)象類型的底層數(shù)據(jù)結(jié)構(gòu)。 本文主要內(nèi)容參考自《Redis設(shè)計(jì)與實(shí)現(xiàn)》 1. 對(duì)象類型和編碼
    的頭像 發(fā)表于 11-14 09:50 ?3627次閱讀
    <b class='flag-5'>Redis</b>五種常見對(duì)象類型的<b class='flag-5'>底層</b>數(shù)據(jù)結(jié)構(gòu)

    Springboot+redis操作多種實(shí)現(xiàn)

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

    Redis實(shí)現(xiàn)限流的三種方式分享

    當(dāng)然,限流有許多種實(shí)現(xiàn)的方式,Redis具有很強(qiáng)大的功能,我用Redis實(shí)踐了三種的實(shí)現(xiàn)方式,可以較為簡(jiǎn)單的實(shí)現(xiàn)其方式。
    的頭像 發(fā)表于 02-22 09:52 ?1634次閱讀

    hash算法在FPGA中的實(shí)現(xiàn)(1)

    在FPGA的設(shè)計(jì)中,尤其是在通信領(lǐng)域,經(jīng)常會(huì)遇到hash算法的實(shí)現(xiàn)。hash算法在FPGA的設(shè)計(jì)中,它主要包括2個(gè)部分,第一個(gè)就是如何選擇一個(gè)好的hash函數(shù),減少碰撞;第二個(gè)就是如何
    的頭像 發(fā)表于 09-07 17:01 ?1924次閱讀
    <b class='flag-5'>hash</b>算法在FPGA中的<b class='flag-5'>實(shí)現(xiàn)</b>(1)

    hash算法在FPGA中的實(shí)現(xiàn)(2)

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

    Redis的數(shù)據(jù)類型有哪些

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

    Redis底層數(shù)據(jù)類型

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

    redis的五種數(shù)據(jù)類型底層數(shù)據(jù)結(jié)構(gòu)

    Redis是一種內(nèi)存數(shù)據(jù)存儲(chǔ)系統(tǒng),支持多種數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu)不僅可以滿足常見的存儲(chǔ)需求,還能夠通過其底層數(shù)據(jù)結(jié)構(gòu)提供高效的操作和查詢。以下是Redis中常用的五種數(shù)據(jù)類型及其底層
    的頭像 發(fā)表于 11-16 11:18 ?1127次閱讀

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

    的單節(jié)點(diǎn)Redis已經(jīng)無法滿足高并發(fā)讀寫和大容量存儲(chǔ)的需求。為了解決這個(gè)問題,Redis集群應(yīng)運(yùn)而生。 Redis集群通過將數(shù)據(jù)分散到多個(gè)節(jié)點(diǎn)上,實(shí)現(xiàn)了水平擴(kuò)展,使得
    的頭像 發(fā)表于 12-04 10:45 ?1259次閱讀

    Java redis鎖怎么實(shí)現(xiàn)

    在Java中實(shí)現(xiàn)Redis鎖涉及到以下幾個(gè)方面:Redis的安裝配置、Redis連接池的使用、Redis數(shù)據(jù)結(jié)構(gòu)的選擇、
    的頭像 發(fā)表于 12-04 10:47 ?1771次閱讀

    redis數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)

    Redis是一種內(nèi)存鍵值數(shù)據(jù)庫(kù),常用于緩存、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)分析等場(chǎng)景。它的高性能得益于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)。本文將詳細(xì)介紹Redis常用的數(shù)據(jù)結(jié)構(gòu)和它們的
    的頭像 發(fā)表于 12-05 10:14 ?1094次閱讀

    Redis集群部署配置詳解

    Redis集群是一種分布式Redis解決方案,通過數(shù)據(jù)分片和主從復(fù)制實(shí)現(xiàn)高可用性和橫向擴(kuò)展。集群將整個(gè)數(shù)據(jù)集分割成16384個(gè)哈希槽(hash slots),每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位。
    的頭像 發(fā)表于 07-17 11:04 ?579次閱讀