Redis資料結構之鍊錶

2021-09-14 03:13:17 字數 2445 閱讀 9951

鍊錶基礎知識:

鍊錶是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序通過鍊錶中的指標鏈結次序來實現。其內部是由一系列的資料節點組成,資料節點可以動態分配。

鍊錶與陣列的比較:

陣列可以隨機訪問,鍊錶只能順序訪問。鍊錶容量可以動態擴充陣列不可以,鍊錶新增資料元素,不需要資料的移動。陣列新增元素需要移動資料元素。

redis裡的鍊錶(基於redis-5.0.4)實現

其資料結構:

struct listnode  listnode;

typedef struct listiter  listiter;

typedef struct list  list;

listnode結構體:

鍊錶當中的資料節點,prev指向它的前乙個節點,next指向它的後乙個節點,value儲存當前節點的值。

listiter結構體:

redis用於實現順序訪問的迭代器,direction控制移動方向。

list結構體:

head指向煉表頭節點,tail指向鍊錶尾節點,len儲存當前鍊錶中資料節點的個數,dup、free、math為三個函式指標,dup用於複製資料資料節點的值,free用於釋放資料節點的空間,match用於比價資料節點的值,其值有鍊錶使用者賦值,賦值使用如下巨集定義:

#define listsetdupmethod(l,m) ((l)->dup = (m))

#define listsetfreemethod(l,m) ((l)->free = (m))

#define listsetmatchmethod(l,m) ((l)->match = (m))

鍊錶介面:

//建立乙個空的鍊錶,返回值為鍊錶指標

list *listcreate(void);

//清空鍊錶中的資料節點,釋放鍊錶空間

void listrelease(list *list);

//清空鍊錶中的資料節點,保留鍊錶空間,使其成為乙個空的鍊錶

void listempty(list *list);

//向鍊錶的頭部新增乙個資料節點,根據當前鍊錶中的資料節點個數是否為零,處理邏輯不同

list *listaddnodehead(list *list, void *value);

//向鍊錶的尾部新增乙個資料節點,根據當前鍊錶中的資料節點個數是否為零,處理邏輯不同

list *listaddnodetail(list *list, void *value);

//在鍊錶list的old_node節點前/後新增乙個值為value的資料節點,前/後由after的值來控制

list *listinsertnode(list *list, listnode *old_node, void *value, int after);

//刪除鍊錶當中的node節點

void listdelnode(list *list, listnode *node);

//獲取list迭代器指標、direction為迭代器方向

listiter *listgetiterator(list *list, int direction);

//迭代器移動到下乙個指標

listnode *listnext(listiter *iter);

//釋放迭代器空間

void listreleaseiterator(listiter *iter);

//複製orig鍊錶,返回值為新的鍊錶

list *listdup(list *orig);

//根據資料元素的值查詢節點,內部使用傳入的match 函式指標來比較

listnode *listsearchkey(list *list, void *key);

//根據資料節點序號,獲取資料節點的指標

listnode *listindex(list *list, long index);

//設定迭代器方向為al_start_head,從頭結點向尾節點訪問

void listrewind(list *list, listiter *li);

//設定迭代器方向為al_start_tail,從尾結點向頭節點訪問

void listrewindtail(list *list, listiter *li);

//將鍊錶的尾節點刪除,並將尾節點重新插入到頭結點之前

void listrotate(list *list);

//將鍊錶l與o合併,函式執行之後l為合併後的鍊錶,o鍊錶被清空

void listjoin(list *l, list *o);

Redis資料結構之鍊錶

redis使用的鍊錶是雙向無環鏈表,鍊錶節點可用於儲存各種不同型別的值。一 鍊錶結構定義 1.鍊錶節點結構定義 2.鍊錶結構定義 示例 二 鍊錶在redis中的用途 1.作為列表鍵的底層實現之一 當乙個列表鍵包含了數量比較多的元素,又或者列表中包含的元素都是比較長的字串時,redis就會使用鍊錶作為...

Redis資料結構 鍊錶

文章導航 readmeredis鍊錶為雙向無環鏈表!redis之資料結構篇 簡單動態字串sds提到redis使用了簡單動態字串,鍊錶,字典 雜湊表 跳躍表,整數集合,壓縮列表這些資料結構來操作記憶體,並且簡單介紹了redis簡單動態字串。本篇文章我們繼續來分析鍊錶。鍊錶是一種非常常見的資料結構,在r...

redis資料結構之雙端鍊錶

redis 的鍊錶資料結構基於 adlist.h 檔案定義的以下三種資料結構來展開 node typedef struct listnode listnode 這裡 node 的value 為什麼要弄成指標?是為了相容多種型別的 node 顯然這裡的 node 既可以儲存 int等常規數字,也可以存...