Redis鏈表實現

鏈表在 Redis 中的應用很是普遍, 好比列表鍵的底層實現之一就是鏈表: 當一個列表鍵包含了數量比較多的元素, 又或者列表中包含的元素都是比較長的字符串時, Redis 就會使用鏈表做爲列表鍵的底層實現。除了鏈表鍵以外, 發佈與訂閱、慢查詢、監視器等功能也用到了鏈表, Redis 服務器自己還使用鏈表來保存多個客戶端的狀態信息, 以及使用鏈表來構建客戶端輸出緩衝區(output buffer)。node

redis實現鏈表的數據結構:c++

//鏈表節點數據結構
typedef struct listNode {
    struct listNode *prev;  //指向上一個節點
    struct listNode *next;  //指向下一個節點
    void *value;  //節點保存的信息
} listNode;
//鏈表迭代器
typedef struct listIter {
    listNode *next;  //指向下一個將要訪問的節點
    int direction;  //訪問的方向
} listIter;
//鏈表數據結構
typedef struct list {
    listNode *head;  //表頭
    listNode *tail;  //表尾
    void *(*dup)(void *ptr);  //dup函數指針
    void (*free)(void *ptr);  //free函數指針
    int (*match)(void *ptr, void *key);  //match函數指針
    unsigned long len;  //表的長度
} list;

由上面的數據結構能夠知道多個listnode能夠組成一個list雙向鏈表,這和數據結構中所學的同樣。redis

list結構中的三個函數指針是用來實現c++中的「多態」,因爲listnode中的value指針指向的內容不一樣,致使對應的dup,free,match也會有所不一樣,這三個函數的做爲分別以下:服務器

  • dup 函數用於複製鏈表節點所保存的值;
  • free 函數用於釋放鏈表節點所保存的值;
  • match 函數則用於對比鏈表節點所保存的值和另外一個輸入值是否相等。

上面實現的雙向鏈表和咱們在數據結構中學習的雙向鏈表本質是一致的,但這個鏈表更加的通用。listnode保存的內容是沒有要求的,它只負責執行內容的地址,至於內容是用什麼數據結構保存的並不關心,真正須要關係內容數據機構的是dup,free和match函數,這樣就很相似於c++中的「多態」。數據結構

相關文章
相關標籤/搜索