国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下)

這篇具有很好參考價(jià)值的文章主要介紹了【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

前言: ?

ZipList:

Ziplist的特性:

QucikList:

QuicList特征:

SkipList:

跳表特征:

RedisObijct:

?小心得:

總結(jié):


?

前言: ?

? ??? ? 在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)存儲(chǔ)和處理是至關(guān)重要的一環(huán)。為了高效地管理數(shù)據(jù),并實(shí)現(xiàn)快速的讀寫操作,各種數(shù)據(jù)庫技術(shù)應(yīng)運(yùn)而生。其中,Redis作為一種高性能的內(nèi)存數(shù)據(jù)庫,廣泛應(yīng)用于緩存、會(huì)話存儲(chǔ)、消息隊(duì)列等場景。要深入了解Redis的工作原理,就必須先了解其底層數(shù)據(jù)結(jié)構(gòu)。

Redis之所以能夠在性能上表現(xiàn)出色,部分原因在于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu)不僅簡單高效,而且能夠滿足各種復(fù)雜的數(shù)據(jù)處理需求。本文將深入探討Redis底層數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)原理,包括字符串、哈希、列表、集合有序集合等,希望能夠幫助讀者更好地理解Redis的內(nèi)部機(jī)制,為進(jìn)一步應(yīng)用和優(yōu)化Redis提供指導(dǎo)。

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

?上一篇文章我們介紹了動(dòng)態(tài)字符串,intset,Dict這三個(gè)底層的數(shù)據(jù)結(jié)構(gòu),本文我們再來介紹一下ZipSet,QuickList,SkipList,RedisObject。

ZipList:

我們在上一篇文章最后介紹了Dict,他是基于鏈表去做的Hash表。但是鏈表有一個(gè)缺陷:內(nèi)存空間不連續(xù),因此容易產(chǎn)生內(nèi)存碎片。

而我們今天要介紹的這個(gè)數(shù)據(jù)結(jié)構(gòu),他是一種特殊的’雙端鏈表‘,由一系列特殊編碼的連續(xù)內(nèi)存塊組成,可以在任意一端進(jìn)行壓入/彈出操作,而且該操作的復(fù)雜度為(O)1

其實(shí)ZipList不是鏈表,我們只是為了方便描述才這么說。

我們可以在Redis的源碼中看一看官方作者對(duì)ZipList的數(shù)據(jù)結(jié)構(gòu)的描述:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

我們用自己的圖來解釋一下各個(gè)部分的意思:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

(下方此圖來自黑馬程序員,如有侵權(quán),立即刪除)?

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

?Ziplist的優(yōu)勢就在于:他的entry的字節(jié)大小是不固定的。

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

而雖然我們這么做可以減少內(nèi)存的浪費(fèi),但是他存在一個(gè)問題:當(dāng)節(jié)點(diǎn)的長度不固定的時(shí)候,我們是如何遍歷節(jié)點(diǎn)的?畢竟已經(jīng)無法通過索引下標(biāo)進(jìn)行遍歷了。要想知道答案,就得先從他的結(jié)點(diǎn)結(jié)構(gòu)看起:

結(jié)點(diǎn)的結(jié)構(gòu)數(shù)據(jù)如圖所示:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

Pervious:前一個(gè)結(jié)點(diǎn)的長度,占一個(gè)或者5個(gè)字節(jié)。

? ? ? ? 如果前一個(gè)結(jié)點(diǎn)的長度小于254,則采用一個(gè)字節(jié)來保存這個(gè)長度值。

? ? ? ? 如果前一個(gè)結(jié)點(diǎn)的長度大于254,則采用五個(gè)字節(jié)來保存這個(gè)長度值,第一個(gè)字節(jié)為0xfe,后? ????????面四個(gè)才是真實(shí)的長度數(shù)據(jù)?

encoding:編碼屬性,記錄content的數(shù)據(jù)類型(字符串還是整數(shù))以及長度,占用1個(gè)2個(gè)或5個(gè)字節(jié)。

contents: 負(fù)責(zé)保存結(jié)點(diǎn)的數(shù)據(jù),可以是字符串或整數(shù)

通過了解Ziplist的結(jié)點(diǎn)結(jié)構(gòu)之后,其實(shí)我們就可以知道:如果我們想要知道下一個(gè)結(jié)點(diǎn)的長度,只需要用起始地址+當(dāng)前結(jié)點(diǎn)三部分的字節(jié)數(shù) ,那就是下一個(gè)結(jié)點(diǎn)的位置了。

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

如果我們想要找到上一個(gè)結(jié)點(diǎn)的位置,也只需要拿當(dāng)前結(jié)點(diǎn)的起始位置-上一個(gè)結(jié)點(diǎn)的長度就好了。

?【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

而ZipList會(huì)有連鎖更新的問題,很簡單:每一個(gè)結(jié)點(diǎn)都存儲(chǔ)著上一個(gè)結(jié)點(diǎn)的信息,如果當(dāng)前結(jié)點(diǎn)的長度發(fā)生變化,那么下一個(gè)結(jié)點(diǎn)中存儲(chǔ)上一個(gè)結(jié)點(diǎn)長度的字節(jié)數(shù)也能會(huì)發(fā)生變化,比如以前長度是5,一個(gè)字節(jié)存儲(chǔ),現(xiàn)在變成了255,五個(gè)字節(jié)存儲(chǔ)。如果每一個(gè)結(jié)點(diǎn)都會(huì)發(fā)生類似的情況,就會(huì)引發(fā)連鎖更新問題

但是目前Redis的作者沒有解決這個(gè)問題,因?yàn)樗母怕屎艿汀?/strong>

其實(shí)我覺得解決這個(gè)問題的思路很簡單,如果我們的節(jié)點(diǎn)有100萬條數(shù)據(jù),那么我們?nèi)绻|發(fā)連鎖更新的話,就會(huì)導(dǎo)致線程阻塞。那我覺得解決思路也很簡單,可以和Dict的Rehash的處理方案一樣,用兩張表,一張進(jìn)行正常的讀取,不阻塞線程,另外一張表進(jìn)行漸進(jìn)式的連鎖更新。

Ziplist的特性:

1.壓縮列表可以看作是一種連續(xù)空間的”雙向鏈表“。

2.節(jié)點(diǎn)之間不是通過指針相連接,而是記錄上一個(gè)節(jié)點(diǎn)和本節(jié)點(diǎn)的長度來尋址,內(nèi)存占用低。

3.如果列表數(shù)據(jù)過多,導(dǎo)致鏈表長度過長,會(huì)影響查詢性能。

4.增加或刪除較大數(shù)據(jù)的時(shí)候可能會(huì)引發(fā)連續(xù)更新問題。

QucikList:

ZipList雖然節(jié)省空間,但是他必須是連續(xù)的空間,如果占用內(nèi)存比較多的話,申請效率就會(huì)很低。

為了解決這個(gè)問題,我們想到了ZipList分片,創(chuàng)建多個(gè)ZipList來存儲(chǔ)數(shù)據(jù):

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

而如何把這多個(gè)ZipList建立聯(lián)系呢?

可以把這幾個(gè)ZipList用指針連接起來。

而QuickList就是這種結(jié)構(gòu),他是一個(gè)雙端鏈表,不過每一個(gè)節(jié)點(diǎn)是ZipList。

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

為了避免QuickList中的每一個(gè) ZipList中entry過多,Redis提供了一個(gè)配置項(xiàng):list-max-ziplist-size來限制。

如果值為正,則標(biāo)識(shí)ZipList中允許的最大entry個(gè)數(shù)的最大值。

如果值為負(fù),則代表ZipList的最大內(nèi)存大小,分五種情況:

  • -1:每個(gè)Zip的內(nèi)存大小不能超過4kb
  • -2:每個(gè)Zip的內(nèi)存大小不能超過8kb
  • -3:每個(gè)Zip的內(nèi)存大小不能超過16kb
  • -4:每個(gè)Zip的內(nèi)存大小不能超過32kb
  • -5:每個(gè)Zip的內(nèi)存大小不能超過64kb

這個(gè)參數(shù)的默認(rèn)值為-2。?

除了對(duì)每一個(gè)ZipList限制大小之外,QuicList還可以對(duì)節(jié)點(diǎn)的ZipList做壓縮?,通過配置項(xiàng)list-compress-depth來控制,因?yàn)殒湵硪话愣际菑氖孜苍L問比較多,所以首位是不壓縮的。而這個(gè)配置的參數(shù)就是控制首尾不壓縮的節(jié)點(diǎn)個(gè)數(shù)。

常見參數(shù):

  • 0:所有節(jié)點(diǎn)都不壓縮
  • 1:標(biāo)識(shí)首尾各有一個(gè)結(jié)點(diǎn)不壓縮,中間結(jié)點(diǎn)壓縮
  • 2:標(biāo)識(shí)QuickList的首尾各有兩個(gè)結(jié)點(diǎn)不壓縮,中間結(jié)點(diǎn)壓縮。

講了這么多,我們來看一看Redis中的源碼:

quicklist源碼:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

quicklistNode源碼:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)?用黑馬的圖來看一看ZipList的數(shù)據(jù)結(jié)構(gòu):

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

QuicList特征:

1.是一個(gè)結(jié)點(diǎn)為ZipList的雙端鏈表。

2.結(jié)點(diǎn)采用了ZipList,解決了傳統(tǒng)鏈表的內(nèi)存占用問題。

3.控制了ZipList的大小,解決了連續(xù)內(nèi)存空間的申請效率?。

4.中間節(jié)點(diǎn)可以壓縮,進(jìn)一步節(jié)省了內(nèi)存。

SkipList:

?雖然前面的幾個(gè)List在空間方面做了優(yōu)化,但是他的查詢效率卻很低,都需要遍歷查詢。

SkipList(跳表)就是為了提高查詢效率而創(chuàng)建的一種數(shù)據(jù)結(jié)構(gòu)。

SkipList首先是鏈表,但是他和傳統(tǒng)的鏈表比起來,有以下區(qū)別:

1.元素按照升序排列。

2.允許一個(gè)結(jié)點(diǎn)包含多個(gè)指針,指針跨度不同。

其實(shí)這個(gè)很好理解,既然是鏈表,那么我們要尋找一個(gè)元素就必須遍歷鏈表。這是因?yàn)殒湵淼拿恳粋€(gè)結(jié)點(diǎn)都存儲(chǔ)的下一個(gè)結(jié)點(diǎn)的位置,沒有跨越的指針。

而我們?nèi)绻梢宰屢粋€(gè)結(jié)點(diǎn)的指針指向的距離不再是1,那不就在一定程度上優(yōu)化了搜索效率。

傳統(tǒng)鏈表:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

跳表思想:

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)??

這樣的話,傳統(tǒng)鏈表我們?nèi)绻獙ふ?,就要遍歷4個(gè)結(jié)點(diǎn),但是現(xiàn)在基于跳表這種思想我們就只用遍歷三個(gè)結(jié)點(diǎn)。

而這也就是跳表需要元素有序排列的意義,如果元素是亂序排放的,那么他往哪里跳就毫無頭緒。

?接下來我們看一看Redis中的跳表的數(shù)據(jù)結(jié)構(gòu):

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

我們來看一下一個(gè)成熟的跳表結(jié)構(gòu):

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)?

跳表特征:

1.跳表是一個(gè)雙向鏈表。

2.跳表每一個(gè)接單都可以包含多層指針,層數(shù)在1-32之間。

3.不同層指針到下一個(gè)結(jié)點(diǎn)的跨度不同,層級(jí)越高,跨度越大。

4.增刪改查效率和紅黑樹一樣,但是實(shí)現(xiàn)更加簡單。

RedisObijct:

Redis中任意數(shù)據(jù)類型的鍵和值都會(huì)被封裝成為一個(gè)RedisObject,也叫做Redis對(duì)象,一個(gè)鍵對(duì)象,一個(gè)值對(duì)象。

typedef struct redisObject{
//對(duì)象類型,分別是string,set,zet,list,hash
    unsigned type:4;
//編碼方式
    unsigned encoding:4;
//當(dāng)前對(duì)象最后一次被訪問的時(shí)間
    unsighed lru:LRU_BITS;
//引用計(jì)數(shù)器,如果為0說明當(dāng)前對(duì)象沒有被引用,可以被回收
    int  refcount;
//指向五種數(shù)據(jù)類型對(duì)應(yīng)的內(nèi)存空間
    void * ptr;
} robj;

?小心得:

一個(gè)redis對(duì)象的頭部,不包含引用對(duì)象的指針就已經(jīng)占據(jù)了16個(gè)字節(jié)的大小。所以我們在實(shí)際使用redis的時(shí)候,盡量避免直接使用String 這種數(shù)據(jù)結(jié)構(gòu),因?yàn)樗敲恳粋€(gè)字符串都需要一個(gè)鍵,那么就會(huì)多占用對(duì)象頭,會(huì)造成很大的性能浪費(fèi)。

?【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

這張圖就很好的表述了我的意思。

RedisObject常見的編碼有:?

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)

總結(jié):

?本文介紹完了Redis的底層數(shù)據(jù)機(jī)構(gòu),從下一篇來時(shí),我們就要開始學(xué)習(xí)Redis我們表層使用的五種數(shù)據(jù)結(jié)構(gòu):String ,set,zet,hash,list。

如果我的內(nèi)容對(duì)你有幫助,請點(diǎn)贊,評(píng)論,收藏。創(chuàng)作不易,大家的支持就是我堅(jiān)持下去的動(dòng)力!

【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下),【從零開始學(xué)習(xí)Redis】,學(xué)習(xí),redis,數(shù)據(jù)結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-848360.html

到了這里,關(guān)于【從零開始學(xué)習(xí)Redis | 第八篇】認(rèn)識(shí)Redis底層數(shù)據(jù)結(jié)構(gòu)(下)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 從零開始學(xué)ZYNQ(FPGA)筆記二 | 認(rèn)識(shí)學(xué)習(xí)內(nèi)容

    從零開始學(xué)ZYNQ(FPGA)筆記二 | 認(rèn)識(shí)學(xué)習(xí)內(nèi)容

    目錄 1. 認(rèn)識(shí)FPGA 什么是FPGA FPGA的編程過程 ?2. 認(rèn)識(shí)ARM 什么是ARM ARM與FPGA的區(qū)別 ARM與Linux 3. 認(rèn)識(shí)ZYNQ ZYNQ與FPGA的區(qū)別 ZYNQ的\\\"ARM\\\"和\\\"FPGA\\\" 關(guān)于PL 關(guān)于PS 4. 學(xué)習(xí)用板載資源 5. 總結(jié) ????????FPGA是一種集成電路,它可以在制造后由客戶或設(shè)計(jì)者根據(jù)需要配置電路功能 。FPGA的內(nèi)部由可

    2024年02月08日
    瀏覽(24)
  • 【從零開始學(xué)習(xí)Java重要知識(shí) | 第三篇】暴打ReentrantLock底層源碼

    【從零開始學(xué)習(xí)Java重要知識(shí) | 第三篇】暴打ReentrantLock底層源碼

    目錄 前言: 前置知識(shí):? 什么是公平鎖與非公平鎖? 嘗試自己構(gòu)造一把鎖: ReentrantLock源碼: 加鎖: 解鎖: 總結(jié): ? 在并發(fā)編程中,線程安全是一個(gè)重要的問題。為了保證多個(gè)線程之間的互斥訪問和正確的同步操作,Java提供了一種強(qiáng)大的鎖機(jī)制——ReentrantLock(可重入鎖

    2024年01月20日
    瀏覽(24)
  • 第八篇:強(qiáng)化學(xué)習(xí)值迭代及代碼實(shí)現(xiàn)

    第八篇:強(qiáng)化學(xué)習(xí)值迭代及代碼實(shí)現(xiàn)

    你好,我是郭震(zhenguo) 前幾天我們學(xué)習(xí)強(qiáng)化學(xué)習(xí)策略迭代,今天,強(qiáng)化學(xué)習(xí)第8篇:強(qiáng)化學(xué)習(xí)值迭代 值迭代是強(qiáng)化學(xué)習(xí)另一種求解方法,用于找到馬爾可夫決策過程(MDP)中的最優(yōu)值函數(shù)。 值迭代 值迭代可以總結(jié)為如下幾點(diǎn): 值迭代通過不斷迭代更新值函數(shù)來逼近最優(yōu)值

    2024年02月08日
    瀏覽(18)
  • spring boot學(xué)習(xí)第八篇:kafka

    spring boot學(xué)習(xí)第八篇:kafka

    目錄 1、安裝kafka 1.1確認(rèn)jdk是否安裝OK 1.2下載安裝kafka 1.3驗(yàn)證kafka 2、連接kafka 3、在java中操作kafka 1、安裝kafka 1.1確認(rèn)jdk是否安裝Ok 1.2下載安裝kafka 配置 進(jìn)入該目錄下的conf文件夾中。 zoo_sample.cfg是一個(gè)配置文件的樣本,需要將這個(gè)文件復(fù)制并重命名為zoo.cfg:??? cp zoo_sample.cf

    2024年01月17日
    瀏覽(21)
  • 【從零開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu) | 第一篇】樹

    【從零開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu) | 第一篇】樹

    目錄 前言:? 樹: 樹結(jié)點(diǎn)之間的關(guān)系描述: ?樹的常見屬性: 森林: ?編輯樹的性質(zhì): 總結(jié): 當(dāng)談?wù)摂?shù)據(jù)結(jié)構(gòu)時(shí),樹(Tree)是一種極為重要且常用的數(shù)據(jù)結(jié)構(gòu)之一。樹的概念源自現(xiàn)實(shí)生活中的樹木,它具有分層結(jié)構(gòu),由 節(jié)點(diǎn)(Node) 和 邊(Edge) 組成,形成了一種類似于

    2024年04月16日
    瀏覽(25)
  • spring boot學(xué)習(xí)第八篇:kafka監(jiān)聽消費(fèi)

    spring boot學(xué)習(xí)第八篇:kafka監(jiān)聽消費(fèi)

    為了實(shí)現(xiàn)監(jiān)聽器功能 pom.xml文件內(nèi)容如下: ?application.yml文件內(nèi)容如下: logback.xml文件內(nèi)容如下: BackendApplication.java文件內(nèi)容如下: 然后添加了kafkaConsumerListenerExample.java文件 發(fā)到服務(wù)器上,啟動(dòng)hmblogs報(bào)錯(cuò),截圖如下: Caused by: java.lang.TypeNotPresentException: Type org.springframework.k

    2024年01月19日
    瀏覽(40)
  • 深入學(xué)習(xí) Redis - 常用數(shù)據(jù)類型,結(jié)構(gòu)認(rèn)識(shí)

    深入學(xué)習(xí) Redis - 常用數(shù)據(jù)類型,結(jié)構(gòu)認(rèn)識(shí)

    目錄 一、Redis數(shù)據(jù)類型? Redis 數(shù)據(jù)類型結(jié)構(gòu)簡單認(rèn)識(shí) 每個(gè)數(shù)據(jù)類型具體的編碼方式 1.string? 2.hash 3.list 4.set 5.zset 典中典:記數(shù)字!??! 6.查看 key 對(duì)應(yīng) value? 的實(shí)際編碼方式 如果本文有幫助到你,不妨給個(gè)三連吧~ Redis 中所有的 key 都是 string 類型,不同的是 value 的數(shù)據(jù)類型

    2024年02月16日
    瀏覽(22)
  • 從零開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)—【鏈表】—【探索環(huán)形鏈的設(shè)計(jì)之美】

    從零開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)—【鏈表】—【探索環(huán)形鏈的設(shè)計(jì)之美】

    雙向環(huán)形鏈表帶哨兵,這個(gè)時(shí)候的 哨兵 , 可以當(dāng)頭,也可做尾 帶哨兵雙向循環(huán)鏈表:結(jié)構(gòu)稍微復(fù)雜,實(shí)現(xiàn)簡單。一般用來單獨(dú)存儲(chǔ)數(shù)據(jù),實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu)都是帶頭雙向鏈表。另外,這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來很多優(yōu)勢。 雙向

    2024年02月22日
    瀏覽(32)
  • 【從零開始學(xué)習(xí)Redis | 第七篇】利用Redis構(gòu)造全局唯一ID(含其他構(gòu)造方法)

    【從零開始學(xué)習(xí)Redis | 第七篇】利用Redis構(gòu)造全局唯一ID(含其他構(gòu)造方法)

    目錄 前言: 什么是全局唯一ID?? 嘗試構(gòu)造全局唯一ID:? 其他構(gòu)造全局唯一ID的方法 1.基于數(shù)據(jù)庫自增構(gòu)造全局唯一ID: 2.基于UUID構(gòu)造全局唯一ID: 3.基于雪花算法構(gòu)造全局唯一ID: 總結(jié): ? ? ? ? ? 在各種實(shí)際業(yè)務(wù)中,全局唯一ID是一個(gè)重要的存在,它用來標(biāo)識(shí)用戶的特定

    2024年01月18日
    瀏覽(18)
  • spring boot學(xué)習(xí)第八篇:通過spring boot、jedis實(shí)現(xiàn)秒單

    spring boot學(xué)習(xí)第八篇:通過spring boot、jedis實(shí)現(xiàn)秒單

    參考:Redis實(shí)現(xiàn)分布式鎖的7種方案 - 知乎 1、 準(zhǔn)備數(shù)據(jù)庫表,如下SQL表示庫存表,有主鍵ID和庫存數(shù)量字段 初始數(shù)據(jù)id? ? ? ? ? ?quantity ? ? ? ? ? ? ? 1111? ? ? ?9 2、pom.xml文件 3、應(yīng)用配置文件 4、StockMapper.xml如下 5、BackendApplication 6、Stock.java如下 7、StockMapper 8、OrderContr

    2024年01月19日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包