Redis之链表
鏈表linkedlist
- 鏈表在Redis中的作用
- 鏈表節點
- 鏈表結構
- 鏈表示意圖
- 總結 : 鏈表的特點
linkedlist是一種有序的數據結構, 并且增加和刪除效率高,C語言沒有實現這種結果,所以Redis自己實現了這種結構
鏈表在Redis中的作用
- 在Redis3.0之前中list底層可以用linkedlist來實現(數據少和小), 也可以用ziplist(數據大或者多)實現
- 在Redis3.0之后, list多用linkedlist和ziplist一起來實現, 叫quicklist(之后的章節會講)
鏈表節點
既然講到了鏈表, 那么其中的節點是如何實現的那么必須要知道, 其實和java中linkedlistNode差不多
typedef struct listNode {struct listNode *prev;struct listNode *next;void *value; } listNode;- 一個指向前面節點的prev指針
- 一個指向后面節點的next指針
- void* 代表可用存儲任何數據, value域存儲數據
鏈表結構
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;- 一個指向頭結點的指針 head(方便插入和刪除)
- 一個指向尾節點的指針 tail(方便插入和刪除)
- 復制節點的函數 dup
- 釋放節點的函數 free
- 節點對比函數 match
- 節點數量 len(就不需要去遍歷鏈表來獲取長度以便達到O(1))
鏈表示意圖
下圖就是大概的示意圖, 幫助理解
總結 : 鏈表的特點
1. 雙端 : 獲取某一個節點的前驅和后驅節點的復制度都為O(1)
2. 無環 : head節點的prev和tail節點的next都為NULL, 不會產生環狀
3. 有鏈表長度計數器 : 擁有len字段,可以直接獲取鏈表長度
4. 有表頭節點和表尾節點, 獲取節點復雜度為O(1)
總結
- 上一篇: Redis之字典(hashtable)
- 下一篇: linux cmake编译源码,linu