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