前面我們使用list實現過隊列 , 現在就來看一下list的底層結構
list有兩種實現方式:
1. 壓縮鏈表
壓縮列表(ziplist)是Redis為了節省內存而開發的,是由一系列特殊編碼的連續內存塊組成的順序型數據結構,一個壓縮列表可以包含任意多個節點(entry),每個節點可以保存一個字節數組或者一個整數值。重點是內存連續
2.雙端鏈表
prev和next兩個指針 , 重點是可以從前往后也可以從后往前 , 這就可以實現lpush rpush這些指令了
因為用的鏈表 , 所以這也就導致了lindex指令 , 獲取某個索引值的元素 , 需要遍歷鏈表才可以獲取到 , 時間復雜度是 O(n)
當列表對象可以同時滿足下列兩個條件時,列表對象采用壓縮鏈表編碼:
(1)列表對象保存的所有字符串元素的長度都小於64字節;
(2)列表元素保存的元素數量小於512個;
以上兩個條件的上限值可以在配置文件中修改 list-max-ziplist-value選項和 list-max-ziplist-entries選項
否則采用雙端鏈表編碼
redis3.2版本以后采用的快速列表
quicklist 是一個雙向鏈表,並且是一個ziplist的雙向鏈表,也就是說quicklist的每個節點都是一個ziplist。結合了兩者的優點
