欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

以下是本篇筆記目錄:

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

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

接下來介紹一下跳躍表和跳躍表節(jié)點結(jié)構(gòu)。

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

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

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

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

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

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

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

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

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

a) header

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

b) tail

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

c) level

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

d) length

length 屬性表示的是跳躍表節(jié)點的個數(shù),也就是跳躍表的長度。

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

跳躍表節(jié)點的各個屬性如下:

a) obj

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

b) score

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

c) backward

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

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

d) skiplistLevel

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

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

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

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

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

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

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

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

5、跳躍表的查詢過程

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

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

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

相關(guān)文章

  • Redis中Hash類型的使用

    Redis中Hash類型的使用

    本文主要介紹了Redis中Hash類型的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis安裝與使用方法小結(jié)

    Redis安裝與使用方法小結(jié)

    這篇文章主要介紹了Redis安裝與使用方法,結(jié)合實例形式分析了Redis數(shù)據(jù)庫的下載、安裝、啟動、設(shè)置及相關(guān)使用操作注意事項,需要的朋友可以參考下
    2018-04-04
  • Redis集群的實現(xiàn)全過程

    Redis集群的實現(xiàn)全過程

    Redis集群的實現(xiàn)方案主要有客戶端分片、代理模式和Cluster模式,其中,Cluster模式是Redis官方推薦的實現(xiàn)方案,它具有高可用性、高性能和自動分片等優(yōu)點
    2024-12-12
  • Redis消息隊列實現(xiàn)異步秒殺功能

    Redis消息隊列實現(xiàn)異步秒殺功能

    在高并發(fā)場景下,為了提高秒殺業(yè)務(wù)的性能,可將部分工作交給 Redis 處理,并通過異步方式執(zhí)行,Redis 提供了多種數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)消息隊列,總結(jié)三種,本文詳細(xì)介紹Redis消息隊列實現(xiàn)異步秒殺功能,感興趣的朋友一起看看吧
    2025-04-04
  • Redis字符串原理的深入理解

    Redis字符串原理的深入理解

    這篇文章主要給大家介紹了關(guān)于Redis字符串原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Redis消息隊列、阻塞隊列、延時隊列的實現(xiàn)

    Redis消息隊列、阻塞隊列、延時隊列的實現(xiàn)

    Redis是一種常用的內(nèi)存數(shù)據(jù)庫,它提供了豐富的功能,通常用于數(shù)據(jù)緩存和分布式隊列,本文主要介紹了Redis消息隊列、阻塞隊列、延時隊列的實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • 詳解Redis瘦身指南

    詳解Redis瘦身指南

    Redis應(yīng)該是開發(fā)者最常用的緩存服務(wù)器了,它豐富的數(shù)據(jù)結(jié)構(gòu),快速高效的內(nèi)存操作能幫助開發(fā)者迅速完成復(fù)雜功能的設(shè)計,作為一個內(nèi)存型數(shù)據(jù)庫,Redis經(jīng)常會遇到內(nèi)存問題,今天我們來談一下Redis常見的內(nèi)存滿的問題,介紹一下給 Redis “瘦身”的通用方式。
    2021-05-05
  • Spring boot+redis實現(xiàn)消息發(fā)布與訂閱的代碼

    Spring boot+redis實現(xiàn)消息發(fā)布與訂閱的代碼

    這篇文章主要介紹了Spring boot+redis實現(xiàn)消息發(fā)布與訂閱,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值需要的朋友可以參考下
    2020-04-04
  • 線上Redis一直報連接超時該如何解決

    線上Redis一直報連接超時該如何解決

    這篇文章主要為大家詳細(xì)介紹了項目開發(fā)時如果出現(xiàn)線上Redis一直報連接超時的問題該如何解決,文中的示例代碼簡潔易懂,需要的小伙伴可以借鑒一下
    2023-08-08
  • 詳解Redis分布式鎖的原理與實現(xiàn)

    詳解Redis分布式鎖的原理與實現(xiàn)

    在單體應(yīng)用中,如果我們對共享數(shù)據(jù)不進(jìn)行加鎖操作,會出現(xiàn)數(shù)據(jù)一致性問題,我們的解決辦法通常是加鎖。下面我們一起聊聊使用redis來實現(xiàn)分布式鎖
    2022-06-06

最新評論