Redis底層資料結構之雙端鍊錶

2021-10-17 20:27:29 字數 1045 閱讀 2308

鍊錶這種資料結構相信大家也不陌生,有很多態別,比如單向鍊錶,雙向鍊錶,迴圈鍊錶等,鍊錶相對於陣列來說,一是不需要連續的記憶體塊位址,二是刪除和插入的時間複雜度是 o(1) 級別的,非常的高效,但比不上陣列的隨機訪問查詢方式。

一樣的那句話,沒有最好的資料結構,只有恰到好處的資料結構,比如我們後面要介紹的更高層次的資料結構,字典,它的底層其實就依賴的鍊錶規避雜湊衝突,具體的我們後面再說。

redis 中借助 c 語言實現了乙個雙向鍊錶結構:

struct listnode

;

prev 指標指向前乙個節點,next 指標指向後乙個節點,value 指向當前節點對應的資料物件。我盜一張圖描述整個串聯起來的鍊錶結構:

雖然我通過鍊錶的第乙個頭節點就可以遍歷整個鍊錶,但在 redis 向上封裝了一層結構,專門用於表示乙個鍊錶結構:

struct list
list 結構為鍊錶提供了表頭指標 head 、表尾指標 tail , 以及鍊錶長度計數器 len , 而 dup 、 free 和 match 成員則是用於實現多型鍊錶所需的型別特定函式:

dup 函式用於複製鍊錶節點所儲存的值;

free 函式用於釋放鍊錶節點所儲存的值;

match 函式則用於對比鍊錶節點所儲存的值和另乙個輸入值是否相等。

redis鍊錶的特性和優點:

由於是雙向鍊錶,具有前後節點的指標引用,所以對獲取這兩個節點的時間複雜度為o(1)。

通過鍊錶長度len屬性,獲取長度的時間複雜度為o(1) 。

由於節點值是乙個指標,所以value可以指定任何型別。

頭節點的前指標和尾結點的後指標都為null,是無環的

Redis底層資料結構 鍊錶

這是普通的鍊錶實現,鍊錶結點不直接持有資料,而是通過void 指標來間接的指向資料.其實現位於src adlist.h與src adlist.c中,關鍵定義如下 typedef struct listnode listnode typedef struct listiter listiter typ...

Redis底層資料結構?

福哥口訣法 簡鏈字跳整 壓快壓 sds synamic string 簡單動態字串。支援自動動態擴容的位元組陣列 list 鍊錶 雙端鍊錶。dict 字典。使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 跳躍表。附加了後向指標的跳躍表 intset 整數集合。用於儲存整數數值集合的自有結...

Redis底層資料結構

redis底層實現的8種資料結構 sds synamic string 支援自動動態擴容的位元組陣列 list 鍊錶 dict 使用雙雜湊表實現的,支援平滑擴容的字典 zskiplist 附加了後向指標的跳躍表 intset 用於儲存整數數值集合的自有結構 ziplist 一種實現上類似於tlv,但...