1. 程式人生 > 其它 >《Redis設計與實現》讀書筆記(三) ——Redis中的連結串列

《Redis設計與實現》讀書筆記(三) ——Redis中的連結串列

《Redis設計與實現》讀書筆記(三) ——Redis中的連結串列

(原創內容,轉載請註明來源,謝謝)

一、概述

連結串列在redis底層實現廣泛,例如redis的list(列表)資料結構在底層就是用連結串列來實現的。連結串列提供了節點重排和順序節點訪問。

除了list,redis的釋出訂閱、慢查詢、監視器等,也使用到了連結串列。redis還用連結串列儲存多個客戶端的狀態資訊,以及用連結串列來構建客戶端的輸出緩衝區。

二、連結串列和表節點的實現

1、節點結構

連結串列的節點結構,採用結構體,如下:

typedef structlistNode{
struct listNode *prev;
struct listNode *next;
struct *value;
}

其中prev指向前一個節點,next指向後一個節點,value儲存著節點本身的值。多個listNode組成雙向連結串列,如下圖所示:

2、連結串列結構

連結串列的結構也是採用結構體定義,如下:

typedef structlist{
listNode *head;
listNode *tail;
unsigned long len;
void *(*dup) (void *ptr);
void *(*free) (void *ptr);
int (*match) (void *ptr, void *key);
}

其中head和tail表示連結串列節點的開始節點和結束節點,len表示連結串列的長度,dup是節點的值複製函式,free是節點的值釋放儲存空間函式,match是節點的值比較函式(比較兩個值是否相等)。

連結串列如下圖所示:

三、redis連結串列結構綜述

redis的連結串列特性如下:

1)雙向,每個listNode節點帶有prev和next指標,可以找到前一個節點和後一個節點,具有雙向性。

2)無環,list連結串列的head節點的prev和tail節點的next指標都是指向null。

3)帶表頭指標和尾指標,即上述的head和tail,獲取頭指標和尾指標的時間複雜度O(1)。

4)帶連結串列長度計數器,即list的len屬性,記錄節點個數,因此獲取節點個數的時間複雜度O(1)。

5)多型,連結串列使用void*指標來儲存節點的值,可以通過list的dup、free、match三個屬性為節點值設定型別特定函式,所以連結串列可以用於儲存不同型別的值。

四、總結

連結串列廣泛用於redis的list、釋出訂閱、慢查詢、監視器等地方;連結串列的每個節點由listNode結構實現,包含前置節點、後置節點指標以及節點值;連結串列本身由list結構實現,包含頭尾指標、連結串列長度、連結串列的比較、複製、釋放空間函式;另外redis的連結串列是雙向、無環,通過為連結串列設定不同型別的特定函式,可以儲存不同的值。

——written by linhxx 2017.08.29