最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中ziplist與quicklist解析與對(duì)比小結(jié)

 更新時(shí)間:2026年01月07日 09:00:52   作者:程序員風(fēng)嶼  
本文介紹了Redis中List數(shù)據(jù)類型的兩種編碼方式ziplist和quicklist,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、背景 — 為什么要有多種“列表(List)”編碼

  • 在內(nèi)存數(shù)據(jù)庫(kù) Redis 中,列表(List)是常用數(shù)據(jù)類型之一,用于實(shí)現(xiàn)隊(duì)列、堆棧、消息隊(duì)列、任務(wù)隊(duì)列等場(chǎng)景。
  • 不同場(chǎng)景對(duì)內(nèi)存使用與訪問(wèn)效率有不同要求:少量元素 → 希望節(jié)省內(nèi)存;大量元素或頻繁插入/刪除 → 需要高性能操作。
  • 因此Redis 設(shè)計(jì)者提供了不同的“編碼方式”(encoding)來(lái)存儲(chǔ) List 對(duì)象,以兼顧 空間效率操作效率。

在歷史發(fā)展中,Redis 對(duì) List 的編碼方式經(jīng)歷了如下階段:

  • 早期:使用 雙向鏈表(linkedlist)壓縮列表(ziplist),兩種可選。
  • 從 Redis 3.2 版本起,引入 quicklist,作為新的默認(rèn)結(jié)構(gòu),取代了 ziplist + linkedlist 的混合策略。

下面分別介紹 ziplist 和 quicklist 的結(jié)構(gòu)與特性,然后比較優(yōu)缺點(diǎn)。

二、ziplist —— 壓縮列表(compact list)

2.1 ziplist 是什么

  • ziplist 是 Redis 提供的一種“緊湊型列表結(jié)構(gòu)(compact list)”。它將多個(gè) list 元素連續(xù)地存放在一塊 連續(xù)內(nèi)存(contiguous memory block) 中。
  • 每個(gè) entry(元素)包含必要的 metadata(如前一個(gè) entry 長(zhǎng)度、當(dāng)前 entry 長(zhǎng)度、數(shù)據(jù)內(nèi)容等),因此 ziplist 可以存放不同長(zhǎng)度的數(shù)據(jù)項(xiàng)(字符串、整數(shù)等),而不需要為每個(gè)元素單獨(dú)分配內(nèi)存。
  • 因?yàn)閮?nèi)存連續(xù)、元素緊湊,ziplist 在內(nèi)存占用上非常高效 — 對(duì)于存儲(chǔ)少量、短字符串/整數(shù)列表時(shí),能節(jié)省大量?jī)?nèi)存。

ziplist結(jié)構(gòu)如圖所示,參考Redis面試題:

下邊的圖也可加深理解

ziplist的各字段含義如下。

  • zlbytes:壓縮列表的字節(jié)長(zhǎng)度,占4B,因此壓縮列表最長(zhǎng) 2³²?1B。
  • zltail:壓縮列表尾元素相對(duì)于壓縮列表起始地址的偏移量,占4B。
  • zllen:壓縮列表的元素?cái)?shù)目,占2B;當(dāng)壓縮列表的元素?cái)?shù)目超過(guò)65535(2¹??1)時(shí),zllen 無(wú)法存儲(chǔ),此時(shí)必須遍歷整個(gè)壓縮列表才能獲取元素?cái)?shù)目。
  • entry1、entr2y:壓縮列表存儲(chǔ)的若干個(gè)元素,可以是字節(jié)數(shù)組或者整數(shù),長(zhǎng)度不限;
  • zlend:壓縮列表的結(jié)尾,占1B,固定為0xFF。

對(duì)于每一個(gè)entry元素來(lái)講

entry 結(jié)構(gòu)包含三個(gè)字段:

  1. prelen
    • 記錄前一個(gè)元素的長(zhǎng)度,用于從后向前遍歷。
    • 前一個(gè)元素長(zhǎng)度 < 254B → 占 1B。
    • 前一個(gè)元素長(zhǎng)度 ≥ 254B → 占 5B(首字節(jié)為 0xFE,后 4B 為實(shí)際長(zhǎng)度)。
  2. encoding
    • 表示 data 的數(shù)據(jù)類型(整數(shù)或字節(jié)數(shù)組)。
    • 長(zhǎng)度可變(1B、2B 或 5B),通過(guò)開(kāi)頭的比特區(qū)分。
    • 同時(shí)可包含字節(jié)數(shù)組的長(zhǎng)度信息(如 6bit、14bit 或 32bit 表示長(zhǎng)度)。

以下是encoding字段的元素編碼

編碼 (encoding) 標(biāo)識(shí) / 類型encoding長(zhǎng)度說(shuō)明 / 含義 (簡(jiǎn)要)
00pppppp1B表示一個(gè) string,長(zhǎng)度 ≤ 63 字節(jié)。
01pppppp + qqqqqqqq2B表示一個(gè) string,長(zhǎng)度 ≤ 2¹??1字節(jié)。
10000000 + 4 bytes length5B表示一個(gè)較長(zhǎng) string(長(zhǎng)度 ≤ 2³²?1字節(jié))。
110000001B表示一個(gè) int16_t(16-bit 整數(shù))元素。
110100001B表示一個(gè) int32_t(32-bit 整數(shù))元素。
111000001B表示一個(gè) 24-bit 整數(shù)編碼(special 24-bit 整數(shù))。
111111101B表示一個(gè) int8_t(8-bit 整數(shù))元素。
1111xxxx1Bxxxx表示范圍為 0–12 的整數(shù) 。
  1. data
    • 實(shí)際存儲(chǔ)的數(shù)據(jù),可以是整數(shù)或字節(jié)數(shù)組,長(zhǎng)度由 encoding 決定。

2.2 ziplist 的適用條件(默認(rèn)策略)

在 Redis 配置文件(或編譯時(shí)默認(rèn))中,對(duì)于 LIST、HASH、ZSET 等類型,會(huì)設(shè)置參數(shù)來(lái)決定是否使用 ziplist,例如:

  • list-max-ziplist-entries:限制 ziplist 中元素(entry)個(gè)數(shù)
  • list-max-ziplist-value:限制每個(gè) entry 的最大字節(jié)數(shù)(value 大?。?/li>

當(dāng)元素?cái)?shù)量或元素大小超過(guò)這些限制時(shí),Redis 會(huì)放棄 ziplist 編碼,轉(zhuǎn)為其他更適合的編碼方式(在老版本可能是 linkedlist,現(xiàn)在是 quicklist)。

2.3 ziplist 的優(yōu)點(diǎn)與缺點(diǎn)

優(yōu)點(diǎn)

  • 內(nèi)存利用率高 — 非常節(jié)省內(nèi)存空間,適合存儲(chǔ)少量、小數(shù)據(jù)。
  • 內(nèi)存連續(xù),有利于 CPU 緩存和遍歷效率。

缺點(diǎn) / 缺陷

  • 對(duì)修改操作(插入 / 刪除 / 更新)不友好 — 因?yàn)橐3诌B續(xù)內(nèi)存,一旦中間插入或刪除,就可能觸發(fā)內(nèi)存重新分配和數(shù)據(jù)搬移(realloc + memcpy),代價(jià)高昂。這里會(huì)涉及連鎖更新問(wèn)題。
  • 當(dāng)元素較多或較大時(shí),ziplist 會(huì)非常臃腫或重復(fù) realloc,性能和穩(wěn)定性都不理想。
  • 因此,ziplist 更適合“短小、穩(wěn)定、不頻繁變更”的列表數(shù)據(jù),不適合大數(shù)據(jù)量或高頻寫入場(chǎng)景。

三、quicklist —— 快速列表(QuickList)

3.1 quicklist 是什么

  • quicklist 是從 Redis 3.2 開(kāi)始引入的 List 編碼方式,用于替代早期的 ziplist /adlist 編碼。
  • 它本質(zhì)上是 雙向鏈表 + 壓縮子列表 的混合結(jié)構(gòu):一個(gè) quicklist 是一個(gè)雙向鏈表,而鏈表的每個(gè)節(jié)點(diǎn)(quicklistNode)內(nèi)部持有一個(gè) ziplist來(lái)存儲(chǔ)一段連續(xù)的元素。
  • 這樣的設(shè)計(jì)兼顧了鏈表和 ziplist 各自的優(yōu)點(diǎn)。

3.2 quicklist 的結(jié)構(gòu)與配置參數(shù)

quicklist 的主要結(jié)構(gòu)由 quicklistquicklistNode 兩個(gè) C 結(jié)構(gòu)體定義,在 Redis 源碼中(例如 quicklist.h / quicklist.c)可以查看。

結(jié)構(gòu)圖

在quicklist中,關(guān)鍵字段包括:

  • head / tail:指向鏈表頭尾節(jié)點(diǎn)。
  • count:List 中所有元素entry的總數(shù)。
  • len:quicklistNode 節(jié)點(diǎn)數(shù)量。
  • fill:用于控制每個(gè) ziplist 容量上限entry 數(shù)量 或 字節(jié)大小,通過(guò) list-max-ziplist-size 配置項(xiàng)設(shè)定。
  • compress:用于控制壓縮深度,即鏈表兩端多少個(gè)節(jié)點(diǎn)不壓縮,中間節(jié)點(diǎn)可被壓縮以節(jié)省內(nèi)存,通過(guò) list-compress-depth 配置項(xiàng)控制。
  • 每個(gè) quicklistNode 包含指向內(nèi)部 ziplist(或 listpack)的指針 zl,大小 sz,元素計(jì)數(shù) count 等信息。

?? 注意:在 Redis 最新版本中(例如 7.x),listpack 已經(jīng)逐步取代 ziplist 作為內(nèi)部壓縮子列表結(jié)構(gòu),但 quicklist 的設(shè)計(jì)思想不變 —— 分段 + 鏈表 + 壓縮子列表。

3.3 quicklist 的優(yōu)點(diǎn)

  • 兼顧空間與效率:通過(guò)將列表拆成多個(gè)小段(ziplist),既避免了大型鏈表帶來(lái)的內(nèi)存碎片和高 overhead,也避免了大型 ziplist 帶來(lái)的頻繁 realloc 問(wèn)題。
  • 快速頭尾操作(push/pop):因?yàn)?quicklist 是鏈表結(jié)構(gòu),在頭尾插入刪除是 O(1) 操作,非常高效,適合隊(duì)列/棧等操作頻繁場(chǎng)景。
  • 壓縮可選:中間節(jié)點(diǎn)可以壓縮(LZF 等算法/listpack 壓縮),節(jié)省內(nèi)存;而頭尾保留原始以保證訪問(wèn)性能。
  • 靈活適應(yīng)不同場(chǎng)景:既適合存儲(chǔ)小量短元素,也適合存儲(chǔ)大量元素或長(zhǎng)列表。

3.4 quicklist 的限制與注意事項(xiàng)

  • 如果配置不當(dāng)(ziplist 內(nèi)部過(guò)大、壓縮設(shè)置不合理),可能出現(xiàn)性能開(kāi)銷過(guò)重,或內(nèi)存碎片/壓縮開(kāi)銷問(wèn)題。
  • quicklist 內(nèi)部實(shí)現(xiàn)比簡(jiǎn)單鏈表或數(shù)組復(fù)雜,對(duì)于某些極端訪問(wèn)模式(大量隨機(jī)訪問(wèn)中間、頻繁跨節(jié)點(diǎn)訪問(wèn))可能不如純數(shù)組或其他結(jié)構(gòu)高效。

quicklist 的兩種極端情況如下:

1. 當(dāng) ziplist 節(jié)點(diǎn)過(guò)多時(shí),quicklist 退化為雙向鏈表。最極端的情況是每個(gè) ziplist 節(jié)點(diǎn)只包含一個(gè) entry,即一個(gè)元素對(duì)應(yīng)一個(gè)節(jié)點(diǎn)。
2. 當(dāng) ziplist 節(jié)點(diǎn)過(guò)少時(shí),quicklist 退化為 ziplist。最極端的情況是整個(gè) quicklist 中只含有一個(gè) ziplist 節(jié)點(diǎn)。

  • 對(duì)于非常頻繁的隨機(jī)訪問(wèn)或修改,可能需要謹(jǐn)慎評(píng)估是否適合使用列表結(jié)構(gòu)。

四、ziplist vs quicklist —— 對(duì)比總結(jié)

特性 / 維度ziplistquicklist
內(nèi)存布局連續(xù)內(nèi)存 block(compact)鏈表 + 多個(gè) ziplist/listpack segments
內(nèi)存開(kāi)銷低,連續(xù)、緊湊較高(鏈表+子列表)但比純鏈表低
適合場(chǎng)景元素少、數(shù)據(jù)小、讀不頻繁修改元素多、隊(duì)列 / 棧 / 批量 push/pop / 變長(zhǎng)頻繁
插入/刪除性能中間插入刪除開(kāi)銷大(可能 memcpy)頭尾 O(1),節(jié)點(diǎn)級(jí)調(diào)整,較穩(wěn)定
內(nèi)存碎片幾乎無(wú)較少(鏈表 + 子列表)
壓縮 / 節(jié)省空間默認(rèn)緊湊可配置壓縮,兼顧效率
Redis 中默認(rèn)支持早期版本Redis 3.2+ 默認(rèn)

Redis 之所以在內(nèi)存數(shù)據(jù)庫(kù) / 緩存系統(tǒng)中表現(xiàn)出色,很大程度上是因?yàn)樗鼮椴煌瑘?chǎng)景提供了優(yōu)化良好的底層數(shù)據(jù)結(jié)構(gòu)。ziplist 與 quicklist 是 Redis List 類型在歷史與現(xiàn)在對(duì)空間與時(shí)間折中的經(jīng)典設(shè)計(jì)。

  • ziplist:為“少量、小數(shù)據(jù)、節(jié)省內(nèi)存”而生。
  • quicklist:為“高性能、靈活、適應(yīng)大/變動(dòng)列表”而設(shè)計(jì)。

到此這篇關(guān)于Redis中ziplist與quicklist解析與對(duì)比小結(jié)的文章就介紹到這了,更多相關(guān)Redis ziplist與quicklist內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis 設(shè)置密碼無(wú)效問(wèn)題解決

    Redis 設(shè)置密碼無(wú)效問(wèn)題解決

    本文主要介紹了Redis 設(shè)置密碼無(wú)效問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Redis高可用-主從復(fù)制、哨兵模式與集群模式詳解

    Redis高可用-主從復(fù)制、哨兵模式與集群模式詳解

    這篇文章主要介紹了Redis高可用-主從復(fù)制、哨兵模式與集群模式的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Redis模糊查詢的幾種實(shí)現(xiàn)方法

    Redis模糊查詢的幾種實(shí)現(xiàn)方法

    本文主要介紹了Redis模糊查詢的幾種實(shí)現(xiàn)方法,包括兩種方法KEYS , SCAN,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Redis哨兵模式介紹

    Redis哨兵模式介紹

    這篇文章介紹了Redis哨兵模式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • Redis在windows環(huán)境下如何啟動(dòng)

    Redis在windows環(huán)境下如何啟動(dòng)

    這篇文章主要介紹了Redis在windows環(huán)境下如何啟動(dòng)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • redis4.0入門小結(jié)

    redis4.0入門小結(jié)

    這篇文章主要介紹了redis4.0入門小結(jié),文中通過(guò)示例和概念介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Redis的六種底層數(shù)據(jù)結(jié)構(gòu)(小結(jié))

    Redis的六種底層數(shù)據(jù)結(jié)構(gòu)(小結(jié))

    本文主要介紹了Redis的六種底層數(shù)據(jù)結(jié)構(gòu),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • RedisTemplate集成+封裝RedisUtil過(guò)程

    RedisTemplate集成+封裝RedisUtil過(guò)程

    本文介紹了如何搭建一個(gè)多模塊的Redis項(xiàng)目,包括項(xiàng)目搭建、配置和測(cè)試,通過(guò)使用父項(xiàng)目管理多個(gè)子模塊,可以實(shí)現(xiàn)單點(diǎn)構(gòu)建、統(tǒng)一版本管理和清晰的項(xiàng)目結(jié)構(gòu),文章還提供了在Spring Boot項(xiàng)目中集成RedisTemplate的示例,并解決了編碼問(wèn)題
    2024-12-12
  • Redis內(nèi)存碎片率調(diào)優(yōu)處理方式

    Redis內(nèi)存碎片率調(diào)優(yōu)處理方式

    Redis集群因內(nèi)存碎片率超過(guò)1.5觸發(fā)告警,分析發(fā)現(xiàn)內(nèi)因與外因?qū)е聝?nèi)存碎片,內(nèi)因?yàn)椴僮飨到y(tǒng)內(nèi)存分配機(jī)制,外因?yàn)镽edis操作特性,使用Redis內(nèi)置內(nèi)存碎片清理機(jī)制可有效降低碎片率,但需注意可能影響性能,建議使用MEMORY命令診斷內(nèi)存使用情況,合理配置參數(shù)以優(yōu)化性能
    2024-09-09
  • redis延時(shí)隊(duì)列的項(xiàng)目實(shí)踐

    redis延時(shí)隊(duì)列的項(xiàng)目實(shí)踐

    本文主要介紹了redis延時(shí)隊(duì)列的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11

最新評(píng)論

万年县| 广元市| 南华县| 县级市| 华宁县| 历史| 张家口市| 临朐县| 远安县| 项城市| 湄潭县| 双鸭山市| 神农架林区| 弋阳县| 黔南| 雷山县| 吴江市| 西平县| 车险| 绥化市| 临湘市| 德庆县| 密云县| 调兵山市| 绵竹市| 扎囊县| 城步| 哈巴河县| 兴安盟| 包头市| 台东市| 平遥县| 凤庆县| 九江市| 阳曲县| 阿图什市| 曲靖市| 新丰县| 临西县| 万山特区| 岱山县|