Redis數據類型之鏈表
鏈表的實現
redis的列表的底層實現就是一個雙鏈表,源碼在src下的adlist.h和adlist.c
鏈表的結點數據結構
/*
* 雙端鏈表節點
*/
typedef struct listNode {
// 前置節點
struct listNode *prev;
// 後置節點
struct listNode *next;
// 節點的值
void *value;
} listNode;
鏈表數據結構
/*
* 雙端鏈表結構
*/
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;
鏈表的redis的具體功能
- 列表鍵
- 發佈與訂閱
- 慢查詢
- 監視器
部分函數的時間複雜度
// 返回給定鏈表所包含的節點數量
// T = O(1)
#define listLength(l) ((l)->len)
// 返回給定鏈表的表頭節點
// T = O(1)
#define listFirst(l) ((l)->head)
// 返回給定鏈表的表尾節點
// T = O(1)
#define listLast(l) ((l)->tail)
// 返回給定節點的前置節點
// T = O(1)
#define listPrevNode(n) ((n)->prev)
// 返回給定節點的後置節點
// T = O(1)
#define listNextNode(n) ((n)->next)
// 返回給定節點的值
// T = O(1)
#define listNodeValue(n) ((n)->value)
// 將鏈表 l 的值複製函數設置爲 m
// T = O(1)
#define listSetDupMethod(l,m) ((l)->dup = (m))
// 將鏈表 l 的值釋放函數設置爲 m
// T = O(1)
#define listSetFreeMethod(l,m) ((l)->free = (m))
// 將鏈表的對比函數設置爲 m
// T = O(1)
#define listSetMatchMethod(l,m) ((l)->match = (m))
// 返回給定鏈表的值複製函數
// T = O(1)
#define listGetDupMethod(l) ((l)->dup)
// 返回給定鏈表的值釋放函數
// T = O(1)
#define listGetFree(l) ((l)->free)
// 返回給定鏈表的值對比函數
// T = O(1)
#define listGetMatchMethod(l) ((l)->match)
/*
* 創建一個新的鏈表
*
* 創建成功返回鏈表,失敗返回 NULL 。
*
* T = O(1)
*/
list *listCreate(void)
{
struct list *list;
// 分配內存
if ((list = zmalloc(sizeof(*list))) == NULL)
return NULL;
// 初始化屬性
list->head = list->tail = NULL;
list->len = 0;
list->dup = NULL;
list->free = NULL;
list->match = NULL;
return list;
}
注意,這裏的分配 malloc函數,是自己實現的zmalloc