關於《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決定。設計