1. 程式人生 > 其它 >Redis原始碼筆記:雙向連結串列

Redis原始碼筆記:雙向連結串列

Redis 的 List 物件的底層實現之一就是連結串列。C 語言本身沒有連結串列這個資料結構的,所以 Redis 自己設計了一個連結串列資料結構。

連結串列節點結構設計

有前置節點和後置節點,可以看的出,這個是一個雙向連結串列。

連結串列結構設計

不過,Redis 在 listNode 結構體基礎上又封裝了 list 這個資料結構,這樣操作起來會更方便,連結串列結構如下:

list 結構為連結串列提供了連結串列頭指標 head、連結串列尾節點 tail、連結串列節點數量 len、以及可以自定義實現的 dup、free、match 函式。

連結串列的優勢與缺陷

連結串列實現優點如下:

  • listNode 連結串列節點的結構裡帶有 prev 和 next 指標,獲取某個節點的前置節點或後置節點的時間複雜度只需O(1),而且這兩個指標都可以指向 NULL,所以連結串列是無環連結串列;

  • list 結構因為提供了表頭指標 head 和表尾節點 tail,所以獲取連結串列的表頭節點和表尾節點的時間複雜度只需O(1);

  • list 結構因為提供了連結串列節點數量 len,所以獲取連結串列中的節點數量的時間複雜度只需O(1);

  • listNode 連結串列節點使用 void* value指標儲存節點值,並且可以通過 list 結構的 dup、free、match 函式指標為節點設定該節點型別特定的函式,因此連結串列節點可以儲存各種不同型別的值;

連結串列的缺陷也是有的:

  • 連結串列每個節點之間的記憶體都是不連續的,意味著無法很好利用 CPU 快取。能很好利用 CPU 快取的資料結構就是陣列,因為陣列的記憶體是連續的,這樣就可以充分利用 CPU 快取來加速訪問。

  • 還有一點,儲存一個連結串列節點的值都需要一個連結串列節點結構頭的分配,記憶體開銷較大。