前言:list即鏈表,它是一個(gè)能維持?jǐn)?shù)據(jù)先后順序的列表,便于在表的兩端追加和刪除數(shù)據(jù),中間位置的存取具有O(N)的時(shí)間復(fù)雜度,是一個(gè)雙向鏈表。
一、內(nèi)部原理
redis內(nèi)部實(shí)現(xiàn)代碼在quicklist.c(注釋:A doubly linked list of ziplists)中,它確實(shí)是一個(gè)雙向鏈表,并且是一個(gè)ziplist雙向列表。
ziplist是什么?
一個(gè)經(jīng)過特殊編碼的的雙向鏈表,它的設(shè)計(jì)目的是為了提高存儲效率。ziplist可以用于存儲字符串或整數(shù),其中整數(shù)是真正的二進(jìn)制進(jìn)行編碼的,而不是編碼成字符串序列。普通的雙向鏈表每一項(xiàng)都獨(dú)立的占用一塊內(nèi)存,各項(xiàng)之間用地址指針連接起來。這中方式會帶來大量的內(nèi)存碎片,而且地址指針也會占用額外的內(nèi)存。而ziplist將列表的每一項(xiàng)存放在前后連續(xù)的地址空間內(nèi),一個(gè)大的ziplist整體占用一大塊內(nèi)存,它是一個(gè)列表,但不是一個(gè)鏈表。ziplist為了在細(xì)節(jié)上節(jié)省內(nèi)存,對于值的存儲采用了變長的編碼方式,對于大的整數(shù),就多一些字節(jié)來存儲,對于小的少一些字節(jié)來存儲。
ziplist的數(shù)據(jù)結(jié)構(gòu)如下:
<zlbytes><zltail><zllen><entry>...<entry><zlend>