面試官:Redis中列表的內部實現方式是什麼?

萬貓學社發表於2022-03-11

在面試間裡等候時,感覺這可真暖和呀,我那冰冷的出租屋還得蓋兩層被子才能睡著。正要把外套脫下來,我突然聽到了門外的腳步聲,隨即門被開啟,一位眉毛彎彎嘴脣紅紅的小姐姐走了進來,甜甜的香水味立刻鑽進了我的鼻孔。

面試官小姐姐微笑地說:”您好,我是今天的面試官,那麼我們就開始吧!“

我收起直勾勾的眼睛連忙說:“好的,好的。”

面試官小姐姐說:“Redis中基本的資料型別有哪些?”

我立刻回答:“Redis的基本資料型別有:字串(string)、列表(list)、雜湊(hash)、集合(set)、有序集合(zset)。”

面試官小姐姐說:“列表型別的內部實現方式是什麼?”

我想了想回答到:

列表的內部編碼有兩種: 壓縮列表(ziplist)和連結串列(linkedlist)。壓縮列表(ziplist)是由一個連續記憶體組成的順序型資料結構。一個壓縮列表可以包含任意多個節點,每個節點上可以儲存一個位元組陣列或整數值。連結串列(linkedlist)是由多個結點通過prev和next指標組成的雙向連結串列。當列表元素個數比較少並且每個元素佔用空間比較小的時候,使用壓縮列表。當列表元素個數比較多或者某個元素佔用空間比較大的時候,使用連結串列。

面試官小姐姐說:“您說的是舊版本的內部編碼,3.2版本之後的實現是什麼樣子的?”

我還沉浸在上一個問題的沾沾自喜中,頓時表情凝固了,手心開始冒出冷汗。“這個。。沒有太深入瞭解”,我支支吾吾的說到。

面試官小姐姐說:“回去等訊息吧。”

這句話說的乾淨利落,我知道已經沒有“然後”了,但是不氣餒的我問:“可不可以稍微提示一下?”

面試官小姐姐微笑地說:“當然可以,在3.2版本開始,使用了快速列表(quicklist)做為列表型別的內部編碼。快速列表(quicklist)是以壓縮列表(ziplist)為節點的連結串列(linkedlist),將連結串列按段切分,每一段使用壓縮列表進行記憶體的連續儲存,多個壓縮列表通過prev和next指標組成的雙向連結串列。它結合了壓縮列表和連結串列的優勢,進一步壓縮了記憶體的使用量,進一步提高了效率。”

在回家的路上,我反思了一下:不能死讀書,還需要關注技術的不斷髮展和進化。雖然這次面試沒有結果,但也不是沒有收穫的。


參考文獻:
《Redis設計與實現》
《Redis開發與運維》
《Redis 深度歷險:核心原理與應用實踐》

最後,謝謝你這麼帥,還給我點贊關注

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍

面試官:Redis中列表的內部實現方式是什麼?

相關文章