Redis設計與實現系列-基本數據結構-鏈表和壓縮列表

關於《Redis設計與實現》讀書筆記redis

鏈表做爲一種很是友好的數據結構在不少高級編程語言中都有內置,然而C語言中沒有沒有鏈表這種數據結構,在redis中redis自行設計了一套鏈表數據結構用於存儲鏈式數據,redis中設計了一個雙端鏈表,該鏈表跟普通鏈表沒什麼大的區別這裏就不詳細描述,本文主要介紹redis中另外一種鏈式數據結構壓縮列表。編程

壓縮列表(ziplist)是用一些列特殊的編碼構成的內存區域,是redis爲了節省內存而設計的,ziplist中每一個節點能夠保存一個長度受限的字符數組(不以 \0 結尾的 char 數組)或者整數,redis中ziplist結果以下圖所示:數組

area        |<---- ziplist header ---->|<----------- entries ------------->|<-end->|

size          4 bytes  4 bytes  2 bytes    ?        ?        ?        ?     1 byte
            +---------+--------+-------+--------+--------+--------+--------+-------+
component   | zlbytes | zltail | zllen | entry1 | entry2 |  ...   | entryN | zlend |
            +---------+--------+-------+--------+--------+--------+--------+-------+
                                       ^                          ^        ^
address                                |                          |        |
                                ZIPLIST_ENTRY_HEAD                |   ZIPLIST_ENTRY_END
                                                                  |
                                                         ZIPLIST_ENTRY_TAIL

一個 ziplist 能夠包含多個節點,每一個節點能夠劃分爲如下幾個部分:數據結構

area        |<------------------- entry -------------------->|

            +------------------+----------+--------+---------+
component   | pre_entry_length | encoding | length | content |
            +------------------+----------+--------+---------+

pre_entry_length:前一個節點的長度,有個這個值就能夠直接經過指針計算直接跳到上一個節點。編程語言

encoding 和 length:encoding 和 length保存着節點字符串的類型及其長度。編碼

content:content保存着節點的內容,長度和類型由encoding和length決定。設計

相關文章
相關標籤/搜索