1. 程式人生 > >redis的list儲存物件實現

redis的list儲存物件實現

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內容。包括型別長度和內容本身部分。