redis源碼分析教程之壓縮鏈表ziplist詳解-創(chuàng)新互聯(lián)

前言

成都創(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),如下圖:

redis源碼分析教程之壓縮鏈表ziplist詳解

壓縮鏈表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)度,有兩種編碼方式。

  • 當(dāng)長(zhǎng)度小于255字節(jié)時(shí),用一個(gè)字節(jié)存儲(chǔ)。
  • 當(dāng)長(zhǎng)度大于等于255時(shí),用五個(gè)字節(jié)進(jìn)行存儲(chǔ),其中第一個(gè)字節(jié)會(huì)被設(shè)置為255表示前一個(gè)entry的長(zhǎng)度由后面四個(gè)字節(jié)表示。

然后是字段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)

網(wǎng)站優(yōu)化排名