redis的list儲存物件實現
阿新 • • 發佈:2019-02-06
redis用了很久,對五種資料結構的使用很熟悉,但是缺乏對實現的認知。所以趁有時間,仔細學習和梳理了下。
List型別的value物件內部是以linkedlist和ziplist承載。當List的元素個數和單個元素的長度較小時,redis會使用ziplist儲存,減少記憶體的佔用,其他情況使用linkedlist。
linkedlist是以雙向連結串列形式實現list的儲存,所以pop、push等操作的複雜度都是O(1)。Lindex類的複雜度是O(n)。
ziplist顧名思義有壓縮的作用,但是單個元素長度較大時,壓縮開銷會再增加,所以不適用。同時ziplist使用的是連續記憶體,且由於其資料結構,其操作的複雜度會高於linkedlist(如LPUSH/LPOP等),所以個數較多時也不會使用。ziplist採用可變長度的壓縮方法,針對較小的整數、較短的string有較好的壓縮效果
ziplist的列表結構
<zlbytes><zltail><zllen><entry><entry><entry>...<zlend>
zlbytes表示list總長度;
zltail指向最末元素,由於ziplist使用的是連續記憶體,所以zltail的值是最末元素距離ziplist的偏移量;
zllen表示元素個數;
entry是元素自身內容;
zlend恆為0XFF作為ziplist的定界符。
元素結構:
(1)相鄰的前一個entry長度
(2)自描述的本entry內容。包括型別長度和內容本身部分。