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