前言
成都創新互聯公司主營通化網站建設的網絡公司,主營網站建設方案,成都App定制開發,通化h5微信小程序定制開發搭建,通化網站營銷推廣歡迎通化等地區企業咨詢壓縮列表(ziplist)是由一系列特殊編碼的內存塊構成的列表,它對于Redis的數據存儲優化有著非常重要的作用。這篇文章總結一下redis中使用非常多的一個數據結構壓縮鏈表ziplist。該數據結構在redis中說是無處不在也毫不過分,除了鏈表以外,很多其他數據結構也是用它進行過渡的,比如前面文章提到的SortedSet。下面話不多說了,來一起看看詳細的介紹吧。
一、壓縮鏈表ziplist數據結構簡介
首先從整體上看下ziplist的結構,如下圖:
壓縮鏈表ziplist結構圖
可以看出字段很多,字節大小也不同,但這也就是壓縮鏈表的精髓所在了,我們依次總結一下。
字段 | 含義 |
---|---|
zlbytes | 該字段是壓縮鏈表的第一個字段,是無符號整型,占用4個字節。用于表示整個壓縮鏈表占用的字節數(包括它自己)。 |
zltail | 無符號整型,占用4個字節。用于存儲從壓縮鏈表頭部到最后一個entry(不是尾元素zlend)的偏移量,在快速跳轉到鏈表尾部的場景使用。 |
zllen | 無符號整型,占用2個字節。用于存儲壓縮鏈表中包含的entry總數。 |
zlend | 特殊的entry,用來表示壓縮鏈表的末尾。占用一個字節,值恒為255。 |
總結為ziplist的頭跟尾,下面再總結一下重中之重的entry字段。
一般來說,一個entry由prevlen,encoding,entry-data三個字段組成,但當entry是個很小的整數時,會根據編碼省略掉entry-data字段。下面依次進行總結:
首先是字段prevlen:表示前一個entry的長度,有兩種編碼方式。
然后是字段encoding:它會根據當前元素內容的不同會采用不同的編碼方式,如下:
1、如果元素內容為字符串,encoding的值分別為:
00xx xxxx :00開頭表示該字符串的長度用6個bit表示。
01xx xxxx | xxxx xxxx :01開頭表示字符串的長度由14bit表示,這14個bit采用大端存儲。
1000 0000 | xxxx xxxx | xxxx xxxx | xxxx xxxx | xxxx xxxx :10開頭表示后續的四個字節為字符串長度,這32個bit采用大端存儲。
2、如果元素內容為數字,encoding的值分別為:
1100 0000:表示數字占用后面2個字節。
1101 0000:表示數字占用后面4個字節。
1110 0000:表示數字占用后面8個字節。
1111 0000 :表示數字占用后面3個字節。
1111 1110 :表示數字占用后面1個字節。
1111 1111 :表示壓縮鏈表中最后一個元素(特殊編碼)。
1111 xxxx :表示只用后4位表示0~12的整數,由于0000,1110跟1111三種已經被占用,也就是說這里的xxxx四位只能表示0001~1101,轉換成十進制就是數字1~13,但是redis規定它用來表示0~12,因此當遇到這個編碼時,我們需要取出后四位然后減1來得到正確的值。
最后是字段entry-data:如果元素的值為字符串,則保存元素本身的值。如果元素的值為很小的數字(按上面編碼規則即0~12),則沒有該字段。
壓縮鏈表的編碼非常復雜,但這也正是該數據結構的精髓所在,一起來看一個例子吧:
注:這個例子是redis源碼中提到的
//由元素2,5組成的壓縮鏈表 [0f 00 00 00] [0c 00 00 00] [02 00] [00 f3] [02 f6] [ff] | | | | | | zlbytes zltail entries "2" "5" end //字符串"Hello World"編碼后的內容 [02] [0b] [48 65 6c 6c 6f 20 57 6f 72 6c 64]
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
分享題目:redis源碼分析教程之壓縮鏈表ziplist詳解-創新互聯
轉載來源:http://m.kartarina.com/article26/cddijg.html
成都網站建設公司_創新互聯,為您提供域名注冊、品牌網站建設、網站維護、網頁設計公司、移動網站建設、品牌網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯