鏈表

鏈表提供了高效的節(jié)點重排能力稽物,以及順序性的訪問方式鞋吉,并且可以通過增刪節(jié)點來靈活的調(diào)整鏈表的長度

Redis使用c語言并沒有內(nèi)置這種數(shù)據(jù)結(jié)構(gòu)鸦做,所以Redis構(gòu)建了自己的鏈表實現(xiàn)

當(dāng)一個列表鍵包含了數(shù)量比較多的元素,又或者列表中包含的元素都是比較長的字符串時谓着,Redis就會使用鏈表作為列表的鍵的底層實現(xiàn)

鏈表的使用

列表鍵
發(fā)布與訂閱
慢查詢
監(jiān)視器
Redis服務(wù)器本身使用鏈表來保存多個客戶端的狀態(tài)信息
使用鏈表來構(gòu)建客戶端輸出緩沖區(qū)

鏈表與鏈表節(jié)點

鏈表節(jié)點adlist.h/listNode
多個listNode可以通過prev和next指針組成雙端鏈表

typedef struct listNode{
  //前置節(jié)點
  struct listNode *prev;
  //后置節(jié)點
  struct listNode *next;
  //節(jié)點的值
  void *value;
}listNode;

鏈表adlist.h/list
list結(jié)構(gòu)為鏈表提供了表頭指針head泼诱,表尾指針tail,以及鏈表長度計數(shù)器len
dup函數(shù)用于復(fù)制鏈表節(jié)點所保存的值
free函數(shù)用于釋放鏈表節(jié)點所保存的值
match函數(shù)用于對比鏈表節(jié)點所保存的值和另一個輸入值是否相等

typedef struct list{
  //表頭節(jié)點
  listNode *head;
  //表尾節(jié)點
  listNode *tail;
  //鏈表所包含的節(jié)點數(shù)量
  unsigned long len;
  //節(jié)點值復(fù)制函數(shù)
  void *(*dup)(void *ptr);
  //節(jié)點值釋放函數(shù)
  void (*free)(void *ptr);
  //節(jié)點值對比函數(shù)
  int (*match)(void *ptr,void *key);
}list;
list結(jié)構(gòu)和listNode結(jié)構(gòu)組成的鏈表

Redis鏈表實現(xiàn)的特性

雙端:鏈表節(jié)點帶有prev和next指針漆魔,獲取某個節(jié)點的前置和后置節(jié)點的復(fù)雜度O(1)

無環(huán):表頭節(jié)點的prev和表尾節(jié)點的next指針都指向NULL坷檩,對鏈表的訪問以NULL為終點

帶表頭指針和表尾指針:通過list結(jié)構(gòu)的head和tail指針,獲取表頭節(jié)點和表尾節(jié)點的指針的復(fù)雜度為O(1)

帶鏈表長度計數(shù)器:len屬性來對list所持有的鏈表節(jié)點進(jìn)行計數(shù)改抡,獲取鏈表中節(jié)點數(shù)量的復(fù)雜度O(1)

多態(tài):鏈表節(jié)點使用void*指針來保存節(jié)點值矢炼,并且可以通過list結(jié)構(gòu)的dup,free阿纤,match三個屬性為節(jié)點值設(shè)置類型特定函數(shù)句灌,所以鏈表可以用于保存各種不同類型的值

鏈表和鏈表節(jié)點的API

函數(shù) 作用 時間復(fù)雜度
listSetDupMethod 將給定的函數(shù)設(shè)置為鏈表的節(jié)點值復(fù)制函數(shù) 復(fù)制函數(shù)可以由dup屬性直接獲得O(1)
listGetDupMethod 返回鏈表當(dāng)前正在使用的節(jié)點值復(fù)制函數(shù) O(1)
listSetFreeMethod 將給定函數(shù)設(shè)置為鏈表的節(jié)點值釋放函數(shù) 釋放函數(shù)可以由free屬性直接獲取O(1)
listGetFree 返回鏈表當(dāng)前正在使用的節(jié)點值釋放函數(shù) O(1)
listSetMatchMethod 將給定的函數(shù)設(shè)置為鏈表的節(jié)點值對比函數(shù) 對比函數(shù)可以通過match屬性直接獲取O(1)
listGetMatchMethod 返回鏈表當(dāng)前正在使用的節(jié)點值對比函數(shù) O(1)
listLength 返回鏈表長度,就是有多少個節(jié)點 len屬性獲取O(1)
listFirst 返回鏈表的頭結(jié)點 head屬性獲取O(1)
listLast 返回鏈表表尾節(jié)點 tail屬性獲取O(1)
listPrevNode 返回給定節(jié)點的前置節(jié)點 prev屬性獲取O(1)
listNextNode 返回給定節(jié)點的后置節(jié)點 next屬性獲取O(1)
listNodeValue 返回給定節(jié)點目前正在保存的值 value屬性獲取O(1)
listCreate 創(chuàng)建一個不包含任何節(jié)點的鏈表 O(1)
listAddNodeHead 將一個包含給定值的新節(jié)點添加到給定鏈表的表頭 O(1)
listAddNodeTail 將一個包含給定值的新節(jié)點添加到給定鏈表的表尾 O(1)
listInsertNode 將一個包含給定值的新結(jié)點添加到給定節(jié)點的之前或者之后 O(1)
listSearchKey 查找并返回鏈表中包含給定值的節(jié)點 O(N),N為鏈表長度
listIndex 返回鏈表在給定索引上的節(jié)點 O(N)
listDelNode 從鏈表中刪除給定節(jié)點 O(N)
listRotate 將鏈表的表尾節(jié)點彈出欠拾,然后將被彈出的節(jié)點插入到鏈表的表頭胰锌,成為新的表頭節(jié)點 O(1)
listDup 復(fù)制一個給定鏈表的副本 O(N)
listRelease 釋放給定鏈表,以及鏈表中的所有節(jié)點 O(N)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藐窄,一起剝皮案震驚了整個濱河市资昧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荆忍,老刑警劉巖格带,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刹枉,居然都是意外死亡叽唱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門微宝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棺亭,“玉大人,你說我怎么就攤上這事蟋软∠庹” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵岳守,是天一觀的道長凄敢。 經(jīng)常有香客問我,道長棺耍,這世上最難降的妖魔是什么贡未? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上俊卤,老公的妹妹穿的比我還像新娘嫩挤。我一直安慰自己,他們只是感情好消恍,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布岂昭。 她就那樣靜靜地躺著,像睡著了一般狠怨。 火紅的嫁衣襯著肌膚如雪约啊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天佣赖,我揣著相機(jī)與錄音恰矩,去河邊找鬼。 笑死憎蛤,一個胖子當(dāng)著我的面吹牛外傅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俩檬,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萎胰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棚辽?” 一聲冷哼從身側(cè)響起技竟,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屈藐,沒想到半個月后榔组,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡估盘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年瓷患,在試婚紗的時候發(fā)現(xiàn)自己被綠了骡尽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣妥。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖攀细,靈堂內(nèi)的尸體忽然破棺而出箫踩,到底是詐尸還是另有隱情,我是刑警寧澤谭贪,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布境钟,位于F島的核電站,受9級特大地震影響俭识,放射性物質(zhì)發(fā)生泄漏慨削。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缚态。 院中可真熱鬧磁椒,春花似錦、人聲如沸玫芦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桥帆。三九已至医增,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間老虫,已是汗流浹背叶骨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工像寒, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赏胚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓锨天,卻偏偏與公主長得像菊卷,于是被迫代替她去往敵國和親缔恳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 鏈表 1. 鏈表和鏈表節(jié)點的實現(xiàn) 每個鏈表節(jié)點使用一個adlist.h/listNode結(jié)構(gòu)來表示 使用adlis...
    xMustang閱讀 128評論 0 0
  • 鏈表作為一種常用的數(shù)據(jù)結(jié)構(gòu)洁闰,提供了高效的節(jié)點重排能力歉甚,以及順序性節(jié)點訪問方式。并且可以通過增刪來靈活的調(diào)整鏈表的長...
    binge1024閱讀 744評論 0 0
  • 鏈表提供了高效的節(jié)點重排能力扑眉,以及順序性的節(jié)點訪問方式纸泄,可以通過增刪節(jié)點來靈活地調(diào)整鏈表的長度。 鏈表在Redis...
    亮亮_ff3d閱讀 108評論 0 0
  • 鏈表簡介 鏈表提供了高效的節(jié)點重排能力腰素, 以及順序性的節(jié)點訪問方式聘裁, 并且可以通過增刪節(jié)點來靈活地調(diào)整鏈表的長度。...
    super_pirlo閱讀 797評論 0 49
  • 實現(xiàn) Redis 的列表類型 雙端鏈表還是 Redis 列表類型的底層實現(xiàn)之一弓千, 當(dāng)對列表類型的鍵進(jìn)行操作 —— ...
    待汝豪杰只是凡夫閱讀 565評論 0 0