redis 雙端鍊錶

2021-07-15 04:43:31 字數 708 閱讀 1893

鍊錶作為陣列之外的一種常用序列抽象,是大多數高階語言的基本資料型別,因為c 語言本身不支援鍊錶型別,大部分c 程式都會自己實現一種鍊錶型別,redis 也不例外.

雙端鍊錶的應用

雙端鍊錶作為一種通用的資料結構,在redis 內部使用得非常多:它既是redis 列表結構的底層實現之一,還被大量redis 模組所使用,用於構建redis 的其他功能.

實現redis 的列表型別

雙端鍊錶還是redis 列表型別的底層實現之一,當對列表型別的鍵進行操作——比如執行rpush 、lpop 或llen 等命令時,程式在底層操作的可能就是雙端鍊錶

redis 列表使用兩種資料結構作為底層實現:

1:雙端鍊錶

2:壓縮列表

因為雙端鍊錶占用的記憶體比壓縮列表要多,所以當建立新的列表鍵時,列表會優先考慮使用壓縮列表作為底層實現,並且在有需要的時候,才從壓縮列表實現轉換到雙端鍊錶實現。

除了實現列表型別以外,雙端鍊錶還被很多redis 內部模組所應用:

1:事務模組使用雙端鍊錶來按順序儲存輸入的命令

2:伺服器模組使用雙端鍊錶來儲存多個客戶端;

3:訂閱/傳送模組使用雙端鍊錶來儲存訂閱模式的多個客戶端;

4:事件模組使用雙端鍊錶來儲存時間事件(time event);

雙端鍊錶的實現

雙端鍊錶的實現由listnode 和list 兩個資料結構構成,下圖展示了由這兩個結構組成的乙個雙端鍊錶例項

1 4雙端鍊錶

雙端鍊錶與普通單鏈表的區別在於既可以從鍊錶頭部開始遍歷,又可以從尾部開始遍歷,這就要求每個節點不僅有乙個後向指標,還要乙個前驅指標。節點資料結構定義如下 public class dlinknode public dlinknode public dlinknode t data 雙端鍊錶資料結構包...

Redis原始碼剖析 雙端鍊錶Sdlist

redis為雙端鍊錶的每乙個節點定義了如下的結構體。鍊錶節點定義 typedef struct listnode listnode 與一般的雙端鍊錶無異,定義了鍊錶節點的結構體之後,下面就定義鍊錶的結構體,用來方便管理鍊錶節點,其結構體定義如下 typedef struct list list re...

redis資料結構之雙端鍊錶

redis 的鍊錶資料結構基於 adlist.h 檔案定義的以下三種資料結構來展開 node typedef struct listnode listnode 這裡 node 的value 為什麼要弄成指標?是為了相容多種型別的 node 顯然這裡的 node 既可以儲存 int等常規數字,也可以存...