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