最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)

 更新時(shí)間:2023年07月03日 17:25:48   作者:Hunter  
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Redis跳躍表結(jié)構(gòu)

跳躍表結(jié)構(gòu)是有序集合的底層實(shí)現(xiàn)之一,它通過(guò)在每個(gè)節(jié)點(diǎn)中維持多個(gè)指向其他節(jié)點(diǎn)的指針,從而達(dá)到快速訪問節(jié)點(diǎn)的目的。

當(dāng)有序集合包含的元素?cái)?shù)量較多,又或者有序集合中的元素的成員是比較長(zhǎng)的字符串時(shí),Redis 就會(huì)使用跳躍表來(lái)作為有序集合的底層實(shí)現(xiàn)。

以下是本篇筆記目錄:

  • 跳躍表及跳躍表節(jié)點(diǎn)結(jié)構(gòu)
  • 跳躍表屬性
  • 跳躍表節(jié)點(diǎn)屬性
  • 跳躍表節(jié)點(diǎn)層(level)的生成
  • 跳躍表的查詢過(guò)程

1、跳躍表及跳躍表節(jié)點(diǎn)結(jié)構(gòu)

接下來(lái)介紹一下跳躍表和跳躍表節(jié)點(diǎn)結(jié)構(gòu)。

跳躍表結(jié)構(gòu):

typedef struct zskiplist{
    // 表頭節(jié)點(diǎn)和表尾節(jié)點(diǎn)
    struct skiplistNode *header, *tail;
    // 表中節(jié)點(diǎn)的數(shù)量
    unsigned long length;
    // 表中層數(shù)最大的節(jié)點(diǎn)的層數(shù)
    int level;
} zskiplist;

跳躍表結(jié)構(gòu)中包含指向表頭和表尾的指針,以及 length 字段表示表中節(jié)點(diǎn)的數(shù)量,level 字段則是表示所有跳躍表節(jié)點(diǎn)中最大的節(jié)點(diǎn)層數(shù),層數(shù)的概念在跳躍表節(jié)點(diǎn)結(jié)構(gòu)中再詳細(xì)說(shuō)明。

跳躍表節(jié)點(diǎn)結(jié)構(gòu):

typedef struct zskiplistNode{
    // 后退指針
    struct zskiplistNode *backward;
    // 分值
    double score;
    // 成員對(duì)象
    robj *obj;
    // 層
    struct zskiplistLevel {
        // 前進(jìn)指針
        struct zskiplistNode *forward;
        // 跨度
        unsigned int span;
    } level [];
} zskiplistNode;

我們可以將跳躍表理解成鏈表,不過(guò)鏈表上的每個(gè)節(jié)點(diǎn)都有指向前面一個(gè)節(jié)點(diǎn)的指針和多個(gè)指向后面某些節(jié)點(diǎn)的指針,指向后面的指針以數(shù)組的形式存在。

接下來(lái)我們以一張圖來(lái)示意一下跳躍表及其節(jié)點(diǎn)之間的關(guān)系。

2、跳躍表結(jié)構(gòu)

在上面的偽代碼示例和上圖結(jié)構(gòu)中,可以看到一個(gè)跳躍表結(jié)構(gòu)如下幾個(gè)屬性:

a) header

header 是跳躍表的頭節(jié)點(diǎn)指針,可以快速定位跳躍表的頭節(jié)點(diǎn)

b) tail

tail 是跳躍表的尾部節(jié)點(diǎn)指針,可以快速定位跳躍表的尾部節(jié)點(diǎn)

c) level

level 表示的是跳躍表節(jié)點(diǎn)中層數(shù)最高的數(shù)值,比如在圖中第三個(gè)跳躍表節(jié)點(diǎn)的層數(shù)最高,數(shù)值是 5,所以跳躍表的這個(gè)值是 5。

d) length

length 屬性表示的是跳躍表節(jié)點(diǎn)的個(gè)數(shù),也就是跳躍表的長(zhǎng)度。

3、跳躍表節(jié)點(diǎn)結(jié)構(gòu)

跳躍表節(jié)點(diǎn)的各個(gè)屬性如下:

a) obj

節(jié)點(diǎn)的成員對(duì)象,見圖中的,o1,o2,o3,是一個(gè)指針,指向一個(gè)字符串對(duì)象,字符串對(duì)象保存著一個(gè) SDS 值,就是有序集合中存儲(chǔ)的數(shù)值。

b) score

有序集合用來(lái)進(jìn)行排序的分值,有序集合通過(guò)這個(gè)屬性用來(lái)對(duì)集合的元素進(jìn)行排序,保存的是 double 類型的浮點(diǎn)數(shù),在跳躍表中,所有節(jié)點(diǎn)按照分值從小到大來(lái)排序。

c) backward

后退指針,跳躍表的每個(gè)節(jié)點(diǎn)通過(guò)這個(gè)屬性指向前一個(gè)節(jié)點(diǎn),用于從表尾向表頭方向訪問節(jié)點(diǎn)。

圖中展示了如何從表尾向跳躍表的頭節(jié)點(diǎn)遍歷的過(guò)程:通過(guò) tail 指針指向跳躍表的尾部節(jié)點(diǎn),然后通過(guò) backward 后退指針逐個(gè)往前遍歷,直到第一個(gè)節(jié)點(diǎn)的 backward 為 NULL 表示遍歷結(jié)束。

d) skiplistLevel

skiplistLevel 是跳躍表節(jié)點(diǎn)的層,層數(shù)介于 1 到 32 之間,每個(gè)層的都包含兩個(gè)屬性,前進(jìn)指針和跨度。

前進(jìn)指針:forward,指向同一層級(jí)的下一個(gè)跳躍表節(jié)點(diǎn)

跨度:span,用于記錄到同層級(jí)的下一個(gè)節(jié)點(diǎn)之間的距離,比如第一個(gè)節(jié)點(diǎn)的第四層級(jí),下一個(gè)節(jié)點(diǎn)的第四層級(jí)是第三個(gè)節(jié)點(diǎn),因此,o1 的第四層級(jí)的的跨度是 2。

4、跳躍表節(jié)點(diǎn)層(level)介紹

前面介紹跳躍表節(jié)點(diǎn)的層屬性是一個(gè)數(shù)組,包含多個(gè)指向下一個(gè)同一層級(jí)的指針,而每個(gè)節(jié)點(diǎn)層的大小則是根據(jù)冪次定律(power law) 來(lái)生成的。

在創(chuàng)建一個(gè)跳躍表節(jié)點(diǎn)的時(shí)候,程序都會(huì)根據(jù)冪次定律隨機(jī)生成一個(gè)介于 1 到 32 之間的值作為 level 數(shù)組的大小,這個(gè)規(guī)則是越大的數(shù)出現(xiàn)的概率越小,它有一種計(jì)算方式,層數(shù)每加 1,出現(xiàn)的概率都是前一個(gè)數(shù)字的 0.25。

比如 level = 1 的概率是 0.75,那么 level = 2 的概率是 0.75 0.25,level = 3 的概率則是 0.75 0.25 * 0.25,直到最高層數(shù)

所以每個(gè)跳躍表節(jié)點(diǎn)的層數(shù)都是隨機(jī)的,跟這個(gè)節(jié)點(diǎn)在跳躍表的前后位置無(wú)關(guān)。

5、跳躍表的查詢過(guò)程

以上面的圖為例,比如我們想查詢 score 為 2.0 的 o2 節(jié)點(diǎn),那么查詢的過(guò)程是這樣的:

  • 首先根據(jù)頭節(jié)點(diǎn)的最高一層節(jié)點(diǎn),在圖中是 L5,L5 指向的是 o3 節(jié)點(diǎn),o3 節(jié)點(diǎn)的分值比目標(biāo)分值 2.0 大,舍棄
  • 頭節(jié)點(diǎn)往下降一層,到 L4,L4 指向下個(gè)節(jié)點(diǎn) o1,o1的 score 比 2.0 小,跳到 o1 節(jié)點(diǎn),繼續(xù)查詢
  • o1 節(jié)點(diǎn)的 L4 指向的下一節(jié)點(diǎn)是 o3,o3 的 score 比 2.0 大,舍棄,o1 的 L4 繼續(xù)下降一層
  • o1 節(jié)點(diǎn)的 L3 節(jié)點(diǎn)指向的 o3 還是不符合條件,繼續(xù)下降一層
  • o1 節(jié)點(diǎn)的 L2 節(jié)點(diǎn)指向的 o2 節(jié)點(diǎn),其分值滿足條件,而從 o1 到 o2 的跨度為 1 + 1 = 2

以上就是Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表使用學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于Redis數(shù)據(jù)結(jié)構(gòu)跳躍表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis中key的操作命令

    Redis中key的操作命令

    本文主要介紹了Redis中key的操作命令,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過(guò)程解析

    redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過(guò)程解析

    本文主要記一次找因redis使用不當(dāng)導(dǎo)致應(yīng)用卡死bug的過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié)

    這篇文章主要介紹了Redis String 類型和 Hash 類型學(xué)習(xí)筆記與總結(jié),本文分別對(duì)String 類型的一些方法和Hash 類型做了詳細(xì)介紹,需要的朋友可以參考下
    2015-06-06
  • Redis全量同步和增量同步原理

    Redis全量同步和增量同步原理

    主從第一次同步是全量同步:也就是說(shuō),當(dāng)你主從節(jié)點(diǎn)連接建立后,需要執(zhí)行一次全量同步,但如果slave重啟后同步,此時(shí)slave重啟后,slave節(jié)點(diǎn)和master節(jié)點(diǎn)的數(shù)據(jù)之間有落后,因此需要進(jìn)行增量同步,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 解讀Redis秒殺優(yōu)化方案(阻塞隊(duì)列+基于Stream流的消息隊(duì)列)

    解讀Redis秒殺優(yōu)化方案(阻塞隊(duì)列+基于Stream流的消息隊(duì)列)

    該文章介紹了使用Redis的阻塞隊(duì)列和Stream流的消息隊(duì)列來(lái)優(yōu)化秒殺系統(tǒng)的方案,通過(guò)將秒殺流程拆分為兩條流水線,使用Redis緩存緩解數(shù)據(jù)庫(kù)壓力,并結(jié)合Lua腳本進(jìn)行原子性判斷,使用阻塞隊(duì)列和消息隊(duì)列異步處理訂單,有效提高了系統(tǒng)的并發(fā)處理能力和可用性
    2025-02-02
  • Redis哨兵機(jī)制的使用詳解

    Redis哨兵機(jī)制的使用詳解

    文章講解了Redis哨兵機(jī)制的基本原理、主庫(kù)和從庫(kù)自動(dòng)切換的過(guò)程、如何減少誤判、哨兵集群的組成和通信機(jī)制,以及哨兵在故障發(fā)生時(shí)如何選舉Leader進(jìn)行主從切換
    2025-01-01
  • redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

    redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

    這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解的相關(guān)資料, intset也即整數(shù)集合,當(dāng)集合保存的值數(shù)量不多時(shí),redis使用intset作為其底層數(shù)據(jù)保存結(jié)構(gòu),希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • redis?setIfAbsent返回null的問題及解決

    redis?setIfAbsent返回null的問題及解決

    這篇文章主要介紹了redis?setIfAbsent返回null的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)的配置步驟

    Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)的配置步驟

    這篇文章主要介紹了Redis 安裝 redistimeseries.so(時(shí)間序列數(shù)據(jù)類型)詳細(xì)教程,配置步驟需要先下載redistimeseries.so 文件,文中介紹了啟動(dòng)失敗問題排查,需要的朋友可以參考下
    2024-01-01
  • redis集群實(shí)現(xiàn)清理前綴相同的key

    redis集群實(shí)現(xiàn)清理前綴相同的key

    這篇文章主要介紹了redis集群實(shí)現(xiàn)清理前綴相同的key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

松原市| 独山县| 临海市| 镇远县| 富裕县| 灌南县| 海兴县| 太和县| 百色市| 甘泉县| 开远市| 浦北县| 汉中市| 颍上县| 和平区| 康平县| 竹北市| 郴州市| 西平县| 婺源县| 浙江省| 安庆市| 那曲县| 萝北县| 长顺县| 彭水| 威信县| 彰武县| 扎赉特旗| 天峻县| 凤庆县| 平陆县| 得荣县| 江孜县| 夏河县| 齐河县| 石楼县| 靖宇县| 涞源县| 襄垣县| 南安市|