詳解redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表
redis使用壓縮列表作為列表鍵和哈希鍵的底層實(shí)現(xiàn)之一。當(dāng)一個(gè)列表鍵只包含少量的列表項(xiàng),并且每個(gè)列表項(xiàng)都是由小整數(shù)值或者是短字符串組成,那么redis就會(huì)使用壓縮列表存儲(chǔ)列表項(xiàng);同理,當(dāng)一個(gè)哈希表包含的鍵值對(duì)都是由小整數(shù)值或者是短字符串組成,并且存儲(chǔ)的鍵值對(duì)數(shù)目不多時(shí),redis也會(huì)使用壓縮列表來(lái)存儲(chǔ)哈希表。以下是壓縮列表存儲(chǔ)結(jié)構(gòu):
- zlbytes長(zhǎng)度為4個(gè)字節(jié),記錄了整個(gè)壓縮列表所占用的字節(jié)數(shù)
- zltail長(zhǎng)度為4個(gè)字節(jié),記錄了壓縮列表起始位置到壓縮列表尾節(jié)點(diǎn)的偏移量
- zllen長(zhǎng)度為2個(gè)字節(jié),記錄了當(dāng)前壓縮列表中所擁有的entry的數(shù)量
- entryX存儲(chǔ)了實(shí)際的對(duì)象,其長(zhǎng)度根據(jù)具體的實(shí)體而定
- zlend長(zhǎng)度為1個(gè)字節(jié),保存了十進(jìn)制的255,用于標(biāo)記壓縮列表的末端
通過(guò)上面的結(jié)構(gòu)可以看出,壓縮列表存儲(chǔ)數(shù)據(jù)的為一整個(gè)數(shù)組,在這個(gè)數(shù)組中前12個(gè)字節(jié)固定保存了zlbytes、zltail和zllen三個(gè)表征整個(gè)壓縮列表屬性的數(shù)據(jù),而后續(xù)的數(shù)組則保存了entry的數(shù)組,最后通過(guò)一個(gè)字節(jié)長(zhǎng)度的屬性zlend來(lái)記錄當(dāng)前壓縮列表已經(jīng)結(jié)束。
在上述結(jié)構(gòu)中,我們并沒(méi)有看到任何屬性用以表征每個(gè)entry的長(zhǎng)度及其存儲(chǔ)的數(shù)據(jù)類型,如字符串或者是整型值,而壓縮列表整體其實(shí)是一個(gè)數(shù)組,因而如果不對(duì)這兩個(gè)類型的數(shù)據(jù)進(jìn)行記錄那么將無(wú)法對(duì)每一個(gè)entry進(jìn)行區(qū)分。實(shí)際上,每個(gè)entry是由三部分組成:previous_entry_length、encoding和content。
1.previous_entry_length為一個(gè)整型值,記錄了前一個(gè)節(jié)點(diǎn)整體占用字節(jié)的長(zhǎng)度,當(dāng)前一個(gè)節(jié)點(diǎn)的長(zhǎng)度小于254時(shí),該屬性占用一個(gè)字節(jié),當(dāng)前一個(gè)節(jié)點(diǎn)長(zhǎng)度大于等于254時(shí),該屬性則占用5個(gè)字節(jié),其第一個(gè)字節(jié)會(huì)保存十進(jìn)制的0xFE,即十進(jìn)制的254,后四個(gè)字節(jié)則保存了前一節(jié)點(diǎn)的長(zhǎng)度;
2.encoding屬性長(zhǎng)度不定,其主要保存了當(dāng)前節(jié)點(diǎn)的編碼格式和節(jié)點(diǎn)的長(zhǎng)度。當(dāng)encoding屬性的最高兩位為00、01或10時(shí),表示其存儲(chǔ)的是字節(jié)數(shù)組。其為00時(shí),encoding占用1個(gè)字節(jié),其后6位保存了content屬性的長(zhǎng)度;為01時(shí),encoding占用2個(gè)字節(jié),其后14位保存了content屬性的長(zhǎng)度;為10時(shí),則其后38位保存了content屬性的長(zhǎng)度。當(dāng)encoding屬性的最高兩位為11時(shí),表示其存儲(chǔ)的是一個(gè)整型值,并且此時(shí)encoding屬性的長(zhǎng)度為1個(gè)字節(jié)。當(dāng)11后兩位,也即第三位和第四位為00時(shí),表示存儲(chǔ)的是int16_t類型的整數(shù),當(dāng)其為01時(shí),表示存儲(chǔ)的是int32_t類型的整數(shù),當(dāng)其為10時(shí),表示存儲(chǔ)的是int64_t類型的整數(shù),當(dāng)其為11時(shí),表示存儲(chǔ)的是24位有符號(hào)整數(shù)。(這四種情況后續(xù)位上的值都為0)當(dāng)11后五位為1,并且最后一位為0時(shí),表示存儲(chǔ)的是8位有符號(hào)整數(shù)。當(dāng)11后兩位為11時(shí),那么該節(jié)點(diǎn)就沒(méi)有content屬性,該節(jié)點(diǎn)的屬性值保存在encoding屬性的后四個(gè)位上,并且其值要介于0~12之間。
3.content屬性保存了該節(jié)點(diǎn)的實(shí)際的字符串或整型數(shù)據(jù)。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
您可能感興趣的文章:- Redis底層數(shù)據(jù)結(jié)構(gòu)詳解
- 詳解Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表
- redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解
- redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡(jiǎn)單動(dòng)態(tài)字符串詳解
- redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解
- 詳解redis數(shù)據(jù)結(jié)構(gòu)之sds
- Redis中5種數(shù)據(jù)結(jié)構(gòu)的使用場(chǎng)景介紹
- Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解