1. 程式人生 > >redis 數據結構基礎 (二) 鏈表

redis 數據結構基礎 (二) 鏈表

ear 數據結構 dup 設計 pty ndt 萬能 div 語言

redis中的鏈表恐怕是最簡單的數據結構了,redis鏈表中總共有3個數據結構:

listNode:

1 typedef struct listNode {
2     struct listNode *prev; //前向節點指針
3     struct listNode *next; //後續節點指針
4     void *value;  //存儲的值,采取void*類型,萬能類型,但是少了類型信息
5 } listNode;

從這個上面可以看出,redis的鏈表是雙向鏈表

list:

typedef struct list {
    listNode *head; //頭結點指針
    listNode 
*tail; //尾節點指針 void *(*dup)(void *ptr); //復制節點數據的函數指針 void (*free)(void *ptr); //釋放節點數據的函數指針 int (*match)(void *ptr, void *key); //這個類似於C++中的operator==操作,即判定節點的數據內容和key指向的內容是否匹配 unsigned long len; //節點的個數 } list;

值得研究一下的是,redis為鏈表實現了叠代器,叠代器是本文的第三個數據結構:

1 typedef struct listIter {
2     listNode *next; //叠代器指向的節點
3 int direction; //叠代器前進的方向 表頭->表尾 or 表尾->表頭? 4 } listIter;

叠代器本身就是一種設計模式,可見C語言一樣可以利用各種設計模式

list的操作都非常簡單,本文不再分析,簡單描述如下: 1 list *listCreate(void); //創建鏈表 2 void listRelease(list *list); //釋放鏈 3 void listEmpty(list *list); //清空鏈表中的數據

 4 list *listAddNodeHead(list *list, void *value); //表頭添加節點 O(1)
5 list *listAddNodeTail(list *list, void *value); //表尾添加節點 O(1) 6 list *listInsertNode(list *list, listNode *old_node, void *value, int after); //插入節點,after參數表明是在該節點前還是該節點後插入該節點 O(1) 7 void listDelNode(list *list, listNode *node); //刪除某節點 O(1) 8 listIter *listGetIterator(list *list, int direction); //得到鏈表的叠代器, direction參數表示這是個前向叠代器還是個逆向叠代器 9 listNode *listNext(listIter *iter); //叠代器指向下一個節點 O(1) 10 void listReleaseIterator(listIter *iter); //釋放叠代器 11 list *listDup(list *orig); //復制鏈表 O(n) 12 listNode *listSearchKey(list *list, void *key); //在鏈表中查找匹配key的節點, 如果match函數不為空,則調用match函數比較,否則直接判定指針的地址的方式來判定 O(n) 13 listNode *listIndex(list *list, long index); //得到第index個節點,註意index可以為負數,-1代表最後一個,-2代表倒數第二個 O(n) 14 void listRewind(list *list, listIter *li); //重置叠代器到表頭,且未前向叠代器 O(1) 15 void listRewindTail(list *list, listIter *li); //重置叠代器到表尾,且未前向叠代器 O(1)
16 void listRotate(list *list); //將表尾的節點作為新的表頭 O(1)
17 void listJoin(list *l, list *o); //將o鏈表中的內容增加到o中去, 操作執行完成後,o中的內容被清空 O(n
o
)

redis鏈表的總結:

1、redis中的鏈表中直接存儲了頭節點和尾節點,不是循環鏈表,到表頭和表尾都是O(1)時間

2、添加、刪除、插入都是O(1)的時間

3、所有的叠代器操作都是O(1)時間

4、獲取鏈表中數據個數的時間也是O(1)

5、redis結構中設置了dup,free,match三個函數指針,使得對數據的操作和鏈表操作解耦,其實就是實現了C語言下的多態

redis 數據結構基礎 (二) 鏈表