Redis-鏈表

鏈表作為一種常用的數(shù)據(jù)結(jié)構(gòu)秉宿,提供了高效的節(jié)點(diǎn)重排能力疙剑,以及順序性節(jié)點(diǎn)訪問方式氯迂。并且可以通過增刪來靈活的調(diào)整鏈表的長(zhǎng)度践叠。在許多高級(jí)語言中都有鏈表的實(shí)現(xiàn)。然而嚼蚀,Redis使用了C語言并沒有實(shí)現(xiàn)這種數(shù)據(jù)結(jié)構(gòu)禁灼。因此Redis自己實(shí)現(xiàn)了鏈表。

鏈表和鏈表節(jié)點(diǎn)的實(shí)現(xiàn)

每一個(gè)鏈表使用一個(gè)adlist.h/listNode結(jié)構(gòu)來實(shí)現(xiàn)

typedef struct listNode{

  struct listNode *prev; //前置節(jié)點(diǎn)

  struct listNode *next; //前置節(jié)點(diǎn)

  void *value; //節(jié)點(diǎn)的值

}listNode;

多個(gè)listNode可以通過由prev和next指針組成的雙向鏈表如下圖:

由prev和next指針組成的雙向鏈表

雖然使用listNode結(jié)構(gòu)可以組成雙向鏈表轿曙,但是為了操作方便可以使用adlist.h/list來持有鏈表弄捕。定義如下:

typedef struct list{
  
  listNode * head; //頭結(jié)點(diǎn)

  listNode * tail; //尾節(jié)點(diǎn)

  unsigned long len; //鏈表所包含的節(jié)點(diǎn)數(shù)量

  void *(*dup) (void *ptr); //節(jié)點(diǎn)值復(fù)制函數(shù)

  void (*free) (void *ptr); //節(jié)點(diǎn)值釋放函數(shù)

  void (*match)(void *ptr,void *key); //節(jié)點(diǎn)值對(duì)比函數(shù)

}list;

list中為鏈表提供了表頭指針head和表尾指針tail以及計(jì)算鏈表持有節(jié)點(diǎn)數(shù)據(jù)量的len,而dup函數(shù)用于復(fù)制鏈表節(jié)點(diǎn)所保存的值导帝,free函數(shù)用于釋放鏈表節(jié)點(diǎn)所保存的值守谓,match函數(shù)用于對(duì)比鏈表節(jié)點(diǎn)保存的的值和;另一個(gè)輸入的值是否相等您单。

由list和listNode組成的鏈表

Redis鏈表的特征

  • 雙向:鏈表節(jié)點(diǎn)帶有prev和next指針斋荞,獲取某一個(gè)節(jié)點(diǎn)的前置節(jié)點(diǎn)和后置節(jié)點(diǎn)的復(fù)雜度都是O(1)。
  • 無環(huán):表頭節(jié)點(diǎn)的prev指針和表尾節(jié)點(diǎn)的next指針都指向NULL虐秦,對(duì)鏈表的訪問以NULL結(jié)束平酿。
  • 帶表頭和表尾指針:通過list的head和tail指針,程序獲得鏈表的表頭和表尾節(jié)點(diǎn)的復(fù)雜度為O(1)羡疗。
  • 帶鏈表長(zhǎng)度計(jì)數(shù)器:通過list的len染服,程序獲取鏈表長(zhǎng)度的復(fù)雜度為O(1)。
  • 多態(tài):鏈表節(jié)點(diǎn)使用void*指針來保存節(jié)點(diǎn)值叨恨,可以通過函數(shù)dup,free,match對(duì)節(jié)點(diǎn)的值進(jìn)行操作柳刮,所以鏈表可以保存不同的類型的值。

總結(jié)

  • 鏈表被廣泛用于實(shí)現(xiàn)Redis的各種功能痒钝。如:鏈表鍵秉颗,發(fā)布與訂閱,慢查詢送矩,監(jiān)視器等蚕甥。

鏈表 API

函數(shù) 作用 時(shí)間復(fù)雜度
listSetDupMethod 將給定的函數(shù)設(shè)置為鏈表的節(jié)點(diǎn)值復(fù)制函數(shù) O(1)
listGetDupMethod 返回鏈表當(dāng)前正在使用的節(jié)點(diǎn)值復(fù)制函數(shù) 復(fù)制函數(shù)可以通過鏈表的 dup 屬性直接獲得, O(1)
listSetFreeMethod 將給定的函數(shù)設(shè)置為鏈表的節(jié)點(diǎn)值釋放函數(shù)栋荸。 O(1) 菇怀。
listGetFree 返回鏈表當(dāng)前正在使用的節(jié)點(diǎn)值釋放函數(shù) 釋放函數(shù)可以通過鏈表的 free 屬性直接獲得, O(1)
listSetMatchMethod 將給定的函數(shù)設(shè)置為鏈表的節(jié)點(diǎn)值對(duì)比函數(shù) O(1)
listGetMatchMethod 返回鏈表當(dāng)前正在使用的節(jié)點(diǎn)值對(duì)比函數(shù)晌块。 對(duì)比函數(shù)可以通過鏈表的 match 屬性直接獲得爱沟, O(1)
listLength 返回鏈表的長(zhǎng)度(包含了多少個(gè)節(jié)點(diǎn))。 鏈表長(zhǎng)度可以通過鏈表的 len 屬性直接獲得匆背, O(1)
listFirst 返回鏈表的表頭節(jié)點(diǎn)呼伸。 表頭節(jié)點(diǎn)可以通過鏈表的 head 屬性直接獲得, O(1)
listLast 返回鏈表的表尾節(jié)點(diǎn) 表尾節(jié)點(diǎn)可以通過鏈表的 tail 屬性直接獲得钝尸, O(1)
listPrevNode 返回給定節(jié)點(diǎn)的前置節(jié)點(diǎn) 前置節(jié)點(diǎn)可以通過節(jié)點(diǎn)的 prev 屬性直接獲得括享, O(1)
listNextNode 返回給定節(jié)點(diǎn)的后置節(jié)點(diǎn) 后置節(jié)點(diǎn)可以通過節(jié)點(diǎn)的 next 屬性直接獲得搂根, O(1)
listNodeValue 返回給定節(jié)點(diǎn)目前正在保存的值 節(jié)點(diǎn)值可以通過節(jié)點(diǎn)的 value 屬性直接獲得, O(1)
listCreate 創(chuàng)建一個(gè)不包含任何節(jié)點(diǎn)的新鏈表 O(1)
listAddNodeHead 將一個(gè)包含給定值的新節(jié)點(diǎn)添加到給定鏈表的表頭 O(1)
listAddNodeTail 將一個(gè)包含給定值的新節(jié)點(diǎn)添加到給定鏈表的表尾 O(1)
listInsertNode 將一個(gè)包含給定值的新節(jié)點(diǎn)添加到給定節(jié)點(diǎn)的之前或者之后 O(1)
listSearchKey 查找并返回鏈表中包含給定值的節(jié)點(diǎn) O(N) 铃辖, N 為鏈表長(zhǎng)度
listIndex 返回鏈表在給定索引上的節(jié)點(diǎn) O(N) 剩愧, N 為鏈表長(zhǎng)度
listDelNode 從鏈表中刪除給定節(jié)點(diǎn) O(1)
listRotate 將鏈表的表尾節(jié)點(diǎn)彈出,然后將被彈出的節(jié)點(diǎn)插入到鏈表的表頭澳叉, 成為新的表頭節(jié)點(diǎn) O(1)
listDup 復(fù)制一個(gè)給定鏈表的副本 O(N) 隙咸, N 為鏈表長(zhǎng)度
listRelease 釋放給定鏈表,以及鏈表中的所有節(jié)點(diǎn) O(N)成洗,N 為鏈表長(zhǎng)度
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末五督,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓶殃,更是在濱河造成了極大的恐慌充包,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥椿,死亡現(xiàn)場(chǎng)離奇詭異基矮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冠场,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門家浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碴裙,你說我怎么就攤上這事钢悲。” “怎么了舔株?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵莺琳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我载慈,道長(zhǎng)惭等,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任办铡,我火速辦了婚禮辞做,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寡具。我一直安慰自己秤茅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布晒杈。 她就那樣靜靜地躺著,像睡著了一般孔厉。 火紅的嫁衣襯著肌膚如雪拯钻。 梳的紋絲不亂的頭發(fā)上帖努,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音粪般,去河邊找鬼拼余。 笑死,一個(gè)胖子當(dāng)著我的面吹牛亩歹,可吹牛的內(nèi)容都是我干的匙监。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼小作,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亭姥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顾稀,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤达罗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后静秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粮揉,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年抚笔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扶认。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殊橙,死狀恐怖辐宾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛀柴,我是刑警寧澤螃概,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站鸽疾,受9級(jí)特大地震影響吊洼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜制肮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一冒窍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豺鼻,春花似錦综液、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春附帽,著一層夾襖步出監(jiān)牢的瞬間埠戳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工蕉扮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留整胃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓喳钟,卻偏偏與公主長(zhǎng)得像屁使,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奔则,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • //leetcode中還有花樣鏈表題蛮寂,這里幾個(gè)例子,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,510評(píng)論 0 6
  • redis使用兩種數(shù)據(jù)結(jié)構(gòu)保存鏈表应狱,分別是ziplist與linkedlist共郭,內(nèi)存占用及常用操作效率各不相同。本...
    但莫閱讀 1,192評(píng)論 0 1
  • redis鏈表存儲(chǔ)一般操作 flushdb會(huì)清除該庫(kù)所有鍵值對(duì) lpush key value 作用:把值插入鏈接...
    Dafanzi閱讀 551評(píng)論 0 0
  • tips:本文參照《redis設(shè)計(jì)與實(shí)現(xiàn)》疾呻、《數(shù)據(jù)結(jié)構(gòu)與算法》除嘹、redis源碼 鏈表提供了高效的節(jié)點(diǎn)重排能力,以及...
    TOUCH_d36e閱讀 413評(píng)論 0 0
  • 《奇葩說》第4季第11集的辯題是:婚禮真的有必要嗎? 很多女生都幻想過自己婚禮的場(chǎng)景璃岳,穿著婚紗年缎,像一個(gè)移動(dòng)的華麗城...
    樂意樂讀閱讀 1,885評(píng)論 0 2