1. 程式人生 > >[Redis專題]list列表操作及其原理分析

[Redis專題]list列表操作及其原理分析

一、list操作

在Redis 中,列表操作通常使用list指令進行,類似於java 的LinkedList,Redis 的列表使用的是連結串列的資料結構進行資料儲存。
在這裡插入圖片描述
上圖建立了一個key 為person 的list ,通過lpop 指令將其依次推出佇列,可見其滿足佇列的先進先出(FIFO)原則。

二、list的底層實現

在上小節中提到,Redis 的list 使用的是連結串列資料結構進行資料儲存,這就意味著list 的插入、刪除操作非常快,為O(1) 複雜度的操作。而查詢操作則十分的緩慢,為O(n)。但實際上,Redis的list並不簡單使用連結串列實現,在list元素較少的時候,使用的是一種連續記憶體空間的資料結構ziplist

(壓縮列表)進行儲存。這樣做的好處是防止過多的不連續的記憶體碎片產生,同時也避免了過多的連結串列前趨、後繼指標佔用過多的記憶體空間。
但這種 “ 元素少時使用ziplist ,元素多時使用linked list ” 作為list的資料結構的方式只存在於Redis 的早期版本,在新的Redis 版本中,這種資料結構被拋棄了,直接使用的是quicklist 資料結構儲存:
在這裡插入圖片描述
如上圖所示,Redis 將多個ziplist 通過雙向指標串聯起來,實現快速連結串列結構。
在這裡插入圖片描述
上圖輸出欄位 encoding 的值:quicklist 是 ziplist 和 linkedlist 的混合體,它將 linkedlist 按段切分,每一段使用 ziplist 來緊湊儲存,多個 ziplist 之間使用雙向指標串接起來。

三、每個 ziplist 存多少元素

quicklist 內部預設單個 ziplist 長度為 8k 位元組,超出了這個位元組數,就會新起一個 ziplist。ziplist 的最大長度由配置檔案的引數list-max-ziplist-size決定。
redis的配置檔案詳細內容可見其開源網站Github的原始碼:https://github.com/antirez/redis/blob/unstable/redis.conf
在這裡插入圖片描述