Redis:數據結構與對象 (鏈表)

鏈表,作爲一種常用的數據結構,內置在很多的高級的編程語言裏面,提供了高效的節點重排能力,以及順序性的節點訪問方式,並且可以通過增刪節點來靈活的調整鏈表的長度。Redis使用的C語言沒有內置這種數據結構,所以Redis構建了自己的鏈表實現。
鏈表在Redis中的使用非常廣泛,比如列表建的底層實現之一就是鏈表。當一個列表建包含了數量比較多的元素,又或者列表中包含的元素都是比較長的字符串時,Redis就會使用鏈表作爲列表建的底層實現。

以下的實現就是一個鏈表,包含了1到1024的整數:
在這裏插入圖片描述除了鏈表建之外,發佈與訂閱、慢查詢、監視器等功能也用到了鏈表。

  • 鏈表和鏈表節點的實現 (/src/adlist.h
/*
 * 
 * 雙端鏈表節點
 */
typedef struct listNode {

    // 前置節點
    struct listNode *prev;

    // 後置節點
    struct listNode *next;

    // 節點的值
    void *value;

} listNode;

多個listNode可以通過prev和next指針組成雙端鏈表
在這裏插入圖片描述

/*
 * 雙端鏈表結構
 */
typedef struct list {

    // 表頭節點
    listNode *head;

    // 表尾節點
    listNode *tail;

    // 節點值複製函數
    void *(*dup)(void *ptr);

    // 節點值釋放函數
    void (*free)(void *ptr);

    // 節點值對比函數
    int (*match)(void *ptr, void *key);

    // 鏈表所包含的節點數量
    unsigned long len;

} list;

在這裏插入圖片描述因爲鏈表表頭節點的前置節點和表尾的後直接點都指向NULL,所以Redis的鏈表實現是無環鏈表。通過爲鏈表設置不同類型特定的函數,Redis的鏈表可以保存、操作各種不同類型的值。

總結:

  • 鏈表在Redis廣泛使用,比如列表建、發佈訂閱、慢查詢、監視器等。
  • 每個鏈表節點有一個listNode來表示,每個節點都有一個指向前置節點和後置節點的指針,所以Redis的鏈表實現是雙端鏈表。
  • 每一個鏈表使用一個list結構表示,結構中帶有表頭結點指針、表尾節點指針,以及鏈表長度等信息。
  • 因爲鏈表表頭節點的前置節點和表尾的後直接點都指向NULL,所以Redis的鏈表實現是無環鏈表
  • 通過爲鏈表設置不同類型特定的函數,鏈表可以保存、操作各種不同類型的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章