詳解redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表
redis使用壓縮列表作為列表鍵和哈希鍵的底層實現(xiàn)之一。當(dāng)一個列表鍵只包含少量的列表項,并且每個列表項都是由小整數(shù)值或者是短字符串組成,那么redis就會使用壓縮列表存儲列表項;同理,當(dāng)一個哈希表包含的鍵值對都是由小整數(shù)值或者是短字符串組成,并且存儲的鍵值對數(shù)目不多時,redis也會使用壓縮列表來存儲哈希表。以下是壓縮列表存儲結(jié)構(gòu):
通過上面的結(jié)構(gòu)可以看出,壓縮列表存儲數(shù)據(jù)的為一整個數(shù)組,在這個數(shù)組中前12個字節(jié)固定保存了zlbytes、zltail和zllen三個表征整個壓縮列表屬性的數(shù)據(jù),而后續(xù)的數(shù)組則保存了entry的數(shù)組,最后通過一個字節(jié)長度的屬性zlend來記錄當(dāng)前壓縮列表已經(jīng)結(jié)束。
在上述結(jié)構(gòu)中,我們并沒有看到任何屬性用以表征每個entry的長度及其存儲的數(shù)據(jù)類型,如字符串或者是整型值,而壓縮列表整體其實是一個數(shù)組,因而如果不對這兩個類型的數(shù)據(jù)進(jìn)行記錄那么將無法對每一個entry進(jìn)行區(qū)分。實際上,每個entry是由三部分組成:previous_entry_length、encoding和content。
1.previous_entry_length為一個整型值,記錄了前一個節(jié)點整體占用字節(jié)的長度,當(dāng)前一個節(jié)點的長度小于254時,該屬性占用一個字節(jié),當(dāng)前一個節(jié)點長度大于等于254時,該屬性則占用5個字節(jié),其第一個字節(jié)會保存十進(jìn)制的0xFE,即十進(jìn)制的254,后四個字節(jié)則保存了前一節(jié)點的長度;
2.encoding屬性長度不定,其主要保存了當(dāng)前節(jié)點的編碼格式和節(jié)點的長度。當(dāng)encoding屬性的最高兩位為00、01或10時,表示其存儲的是字節(jié)數(shù)組。其為00時,encoding占用1個字節(jié),其后6位保存了content屬性的長度;為01時,encoding占用2個字節(jié),其后14位保存了content屬性的長度;為10時,則其后38位保存了content屬性的長度。當(dāng)encoding屬性的最高兩位為11時,表示其存儲的是一個整型值,并且此時encoding屬性的長度為1個字節(jié)。當(dāng)11后兩位,也即第三位和第四位為00時,表示存儲的是int16_t類型的整數(shù),當(dāng)其為01時,表示存儲的是int32_t類型的整數(shù),當(dāng)其為10時,表示存儲的是int64_t類型的整數(shù),當(dāng)其為11時,表示存儲的是24位有符號整數(shù)。(這四種情況后續(xù)位上的值都為0)當(dāng)11后五位為1,并且最后一位為0時,表示存儲的是8位有符號整數(shù)。當(dāng)11后兩位為11時,那么該節(jié)點就沒有content屬性,該節(jié)點的屬性值保存在encoding屬性的后四個位上,并且其值要介于0~12之間。
3.content屬性保存了該節(jié)點的實際的字符串或整型數(shù)據(jù)。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
標(biāo)簽:揚州 贛州 澳門 景德鎮(zhèn) 廣東 唐山 香港 林芝
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表》,本文關(guān)鍵詞 詳解,redis,數(shù)據(jù)結(jié)構(gòu),之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。