redis 內(nèi)部數(shù)據(jù)結(jié)構(gòu)(1.6)-壓縮列表

壓縮列表(ziplist)是列表鍵和哈希鍵的底層實(shí)現(xiàn)之一甘邀。

當(dāng)一個(gè)列表鍵只包含少量列表項(xiàng)伟骨, 并且每個(gè)列表項(xiàng)要么就是小整數(shù)值仔夺, 要么就是長(zhǎng)度比較短的字符串咆畏, 那么 Redis 就會(huì)使用壓縮列表來(lái)做列表鍵的底層實(shí)現(xiàn)南捂。

比如說(shuō), 執(zhí)行以下命令將創(chuàng)建一個(gè)壓縮列表實(shí)現(xiàn)的列表鍵:

redis> RPUSH lst 1 3 5 10086 "hello" "world"
(integer) 6

redis> OBJECT ENCODING lst
"ziplist"

因?yàn)榱斜礞I里面包含的都是 1 鳖眼、 3 、 5 嚼摩、 10086 這樣的小整數(shù)值钦讳, 以及 "hello" 、 "world" 這樣的短字符串枕面。

另外愿卒, 當(dāng)一個(gè)哈希鍵只包含少量鍵值對(duì), 并且每個(gè)鍵值對(duì)的鍵和值要么就是小整數(shù)值潮秘, 要么就是長(zhǎng)度比較短的字符串琼开, 那么 Redis 就會(huì)使用壓縮列表來(lái)做哈希鍵的底層實(shí)現(xiàn)。

舉個(gè)例子枕荞, 執(zhí)行以下命令將創(chuàng)建一個(gè)壓縮列表實(shí)現(xiàn)的哈希鍵:

redis> HMSET profile "name" "Jack" "age" 28 "job" "Programmer"
OK

redis> OBJECT ENCODING profile
"ziplist"

壓縮列表是 Redis 為了節(jié)約內(nèi)存而開(kāi)發(fā)的柜候, 由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型(sequential)數(shù)據(jù)結(jié)構(gòu)。

一個(gè)壓縮列表可以包含任意多個(gè)節(jié)點(diǎn)(entry)躏精, 每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者一個(gè)整數(shù)值渣刷。

壓縮表的構(gòu)成

圖 7-1 展示了壓縮列表的各個(gè)組成部分, 表 7-1 則記錄了各個(gè)組成部分的類(lèi)型矗烛、長(zhǎng)度辅柴、以及用途。

Paste_Image.png
  • 列表 zlbytes 屬性的值為 0x50 (十進(jìn)制 80)瞭吃, 表示壓縮列表的總長(zhǎng)為 80 字節(jié)碌嘀。
  • 列表 zllen 屬性的值為 0x3 (十進(jìn)制 3), 表示壓縮列表包含三個(gè)節(jié)點(diǎn)歪架。
  • 列表 zltail 屬性的值為 0x3c (十進(jìn)制 60)股冗, 這表示如果我們有一個(gè)指向壓縮列表起始地址的指針 p , 那么只要用指針 p 加上偏移量 60 和蚪, 就可以計(jì)算出表尾節(jié)點(diǎn) entry3 的地址魁瞪。
Paste_Image.png

圖 7-3 展示了另一個(gè)壓縮列表示例:

  • 列表 zlbytes 屬性的值為 0xd2 (十進(jìn)制 210)穆律, 表示壓縮列表的總長(zhǎng)為 210 字節(jié)。
  • 列表 zltail 屬性的值為 0xb3 (十進(jìn)制 179)导俘, 這表示如果我們有一個(gè)指向壓縮列表起始地址的指針 p 峦耘, 那么只要用指針 p 加上偏移量 179 , 就可以計(jì)算出表尾節(jié)點(diǎn) entry5 的地址旅薄。
  • 列表 zllen 屬性的值為 0x5 (十進(jìn)制 5)辅髓, 表示壓縮列表包含五個(gè)節(jié)點(diǎn)。
Paste_Image.png

壓縮表節(jié)點(diǎn)的構(gòu)成

每個(gè)壓縮列表節(jié)點(diǎn)都由 previous_entry_length 少梁、 encoding 洛口、 content 三個(gè)部分組成

Paste_Image.png

previous_entry_length

節(jié)點(diǎn)的 previous_entry_length 屬性以字節(jié)為單位, 記錄了壓縮列表中前一個(gè)節(jié)點(diǎn)的長(zhǎng)度凯沪。

previous_entry_length 屬性的長(zhǎng)度可以是 1 字節(jié)或者 5 字節(jié):

  • 如果前一節(jié)點(diǎn)的長(zhǎng)度小于 254 字節(jié)第焰, 那么 previous_entry_length 屬性的長(zhǎng)度為 1 字節(jié): 前一節(jié)點(diǎn)的長(zhǎng)度就保存在這一個(gè)字節(jié)里面。
  • 如果前一節(jié)點(diǎn)的長(zhǎng)度大于等于 254 字節(jié)妨马, 那么 previous_entry_length 屬性的長(zhǎng)度為 5 字節(jié): 其中屬性的第一字節(jié)會(huì)被設(shè)置為 0xFE(十進(jìn)制值 254)挺举, 而之后的四個(gè)字節(jié)則用于保存前一節(jié)點(diǎn)的長(zhǎng)度。
Paste_Image.png

因?yàn)楣?jié)點(diǎn)的 previous_entry_length 屬性記錄了前一個(gè)節(jié)點(diǎn)的長(zhǎng)度烘跺, 所以程序可以通過(guò)指針運(yùn)算湘纵, 根據(jù)當(dāng)前節(jié)點(diǎn)的起始地址來(lái)計(jì)算出前一個(gè)節(jié)點(diǎn)的起始地址。

encoding

節(jié)點(diǎn)的 encoding 屬性記錄了節(jié)點(diǎn)的 content 屬性所保存數(shù)據(jù)的類(lèi)型以及長(zhǎng)度

content

節(jié)點(diǎn)的 content 屬性負(fù)責(zé)保存節(jié)點(diǎn)的值滤淳, 節(jié)點(diǎn)值可以是一個(gè)字節(jié)數(shù)組或者整數(shù)梧喷, 值的類(lèi)型和長(zhǎng)度由節(jié)點(diǎn)的 encoding 屬性決定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脖咐,一起剝皮案震驚了整個(gè)濱河市铺敌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屁擅,老刑警劉巖适刀,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異煤蹭,居然都是意外死亡笔喉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)硝皂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)常挚,“玉大人,你說(shuō)我怎么就攤上這事稽物⊙僬保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贝或,是天一觀的道長(zhǎng)吼过。 經(jīng)常有香客問(wèn)我锐秦,道長(zhǎng),這世上最難降的妖魔是什么盗忱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任酱床,我火速辦了婚禮,結(jié)果婚禮上趟佃,老公的妹妹穿的比我還像新娘扇谣。我一直安慰自己,他們只是感情好闲昭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布罐寨。 她就那樣靜靜地躺著,像睡著了一般序矩。 火紅的嫁衣襯著肌膚如雪鸯绿。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天簸淀,我揣著相機(jī)與錄音瓶蝴,去河邊找鬼。 笑死啃擦,一個(gè)胖子當(dāng)著我的面吹牛囊蓝,可吹牛的內(nèi)容都是我干的饿悬。 我是一名探鬼主播令蛉,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狡恬!你這毒婦竟也來(lái)了珠叔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弟劲,失蹤者是張志新(化名)和其女友劉穎祷安,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體兔乞,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汇鞭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庸追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霍骄。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖淡溯,靈堂內(nèi)的尸體忽然破棺而出读整,到底是詐尸還是另有隱情,我是刑警寧澤咱娶,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布米间,位于F島的核電站强品,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屈糊。R本人自食惡果不足惜的榛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望另玖。 院中可真熱鬧困曙,春花似錦、人聲如沸谦去。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鳄哭。三九已至要糊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妆丘,已是汗流浹背锄俄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勺拣,地道東北人奶赠。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像药有,于是被迫代替她去往敵國(guó)和親毅戈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • redis使用兩種數(shù)據(jù)結(jié)構(gòu)保存鏈表愤惰,分別是ziplist與linkedlist苇经,內(nèi)存占用及常用操作效率各不相同。本...
    但莫閱讀 1,192評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理宦言,服務(wù)發(fā)現(xiàn)扇单,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 引入 Redis對(duì)外提供了5種類(lèi)型:字符串奠旺、列表蜘澜、集合、有序集合以及哈希表响疚,但底層實(shí)現(xiàn)并不是固定的鄙信,以上五種數(shù)據(jù)結(jié)...
    宇宙最強(qiáng)架構(gòu)師閱讀 650評(píng)論 0 3
  • 今天的推薦話(huà)題,自從參加了好報(bào)稽寒,寫(xiě)作中有什么心得扮碧,困惑,影響,寫(xiě)而不思則罔慎王,思而不寫(xiě)則怠蚓土,今個(gè)總結(jié)一下都有啥。 心...
    名貝貝閱讀 179評(píng)論 0 0
  • 蕭筱決定在今天這個(gè)特殊的日子里干一件一直想做卻沒(méi)勇氣做的事情。 深呼吸一口氣咱旱,發(fā)了條朋友圈:“不喜歡用鮮花或者其他...
    黃梓杺Sarah閱讀 326評(píng)論 0 0