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

redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表

 更新時(shí)間:2022年03月21日 09:25:37   作者:周杰倫本人  
這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表,壓縮列表是列表list和hash數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)之一,是redis為了節(jié)約內(nèi)存而開發(fā)的,由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下

壓縮列表是列表鍵和哈希鍵的底層實(shí)現(xiàn)之一。當(dāng)一個(gè)列表鍵只包含少量列表項(xiàng),并且每個(gè)列表項(xiàng)要么就是小整數(shù),要么就是長度比較短的字符串,redis就會使用壓縮列表來做列表鍵的底層實(shí)現(xiàn)

當(dāng)一個(gè)哈希鍵只包含少量鍵值對,并且每個(gè)鍵值對的鍵和值要么就是小整數(shù)值,要么就是長度比較短的字符串,那么Redis就會使用壓縮列表來做哈希鍵的底層實(shí)現(xiàn)。

壓縮列表是Redis為了節(jié)約內(nèi)存而開發(fā)的是由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu),一個(gè)壓縮列表可以包含任意多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者一個(gè)整數(shù)值

ziplist 數(shù)據(jù)結(jié)構(gòu):壓縮列表各個(gè)組成部分

壓縮列表各個(gè)組成部分詳細(xì)說明:

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

每個(gè)壓縮列表節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或者一個(gè)整數(shù)值,其中字節(jié)數(shù)組可以是以下三種長度的其中一種

長度小于等于63字節(jié)的字節(jié)數(shù)組

長度小于等于16383字節(jié)的字節(jié)數(shù)組

長度小于等于4294967295字節(jié)的字節(jié)數(shù)組

數(shù)值則可以是以下六種長度的其中一種:

  • 1:  4位長介于0至12之間的無符號整數(shù)
  • 2:1字節(jié)長的有符號整數(shù)
  • 3: 3字節(jié)長的有符號整數(shù)
  • 4:int16類型整數(shù)
  • 5:int32類型整數(shù)
  • 6 : int64類型整數(shù)

壓縮列表的數(shù)據(jù)結(jié)構(gòu):

壓縮列表是redis為了節(jié)約內(nèi)存而開發(fā)的,由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型數(shù)據(jù)結(jié)構(gòu)。一個(gè)壓縮列表可以包含任意多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)保存一個(gè)字節(jié)數(shù)組或者一個(gè)整數(shù)值。

創(chuàng)建一個(gè)空的ziplist:

/*
?* 新創(chuàng)建一個(gè)空 ziplist
?*?
?* 復(fù)雜度:O(1)
?*
?* 返回值:新創(chuàng)建的 ziplist
?*/
unsigned char *ziplistNew(void) {
? ? // 分配 2 個(gè) 32 bit,一個(gè) 16 bit,以及一個(gè) 8 bit
? ? // 分別用于 <zlbytes><zltail><zllen> 和 <zlend>
? ? unsigned int bytes = ZIPLIST_HEADER_SIZE+1;
? ? unsigned char *zl = zmalloc(bytes);

? ? // 設(shè)置長度
? ? ZIPLIST_BYTES(zl) = intrev32ifbe(bytes);

? ? // 設(shè)置表尾偏移量
? ? ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(ZIPLIST_HEADER_SIZE);

? ? // 設(shè)置列表項(xiàng)數(shù)量
? ? ZIPLIST_LENGTH(zl) = 0;

? ? // 設(shè)置表尾標(biāo)識
? ? zl[bytes-1] = ZIP_END;

? ? return zl;
}

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

壓縮列表組成部分:

  • zlbytes:記錄整個(gè)壓縮列表占用的內(nèi)存字節(jié)數(shù)
  • zltail:記錄壓縮列表表尾節(jié)點(diǎn)距離壓縮列表的起始地址的字節(jié)數(shù)
  • entryX:列表節(jié)點(diǎn)
  • zlend:用于標(biāo)記壓縮列表的末端

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

  • preivous_entry_length:記錄壓縮列表中前一個(gè)節(jié)點(diǎn)的長度
  • encoding:記錄節(jié)點(diǎn)content屬性保存數(shù)據(jù)的類型以及長度
  • content:負(fù)責(zé)保存節(jié)點(diǎn)的值,值的類型和長度由節(jié)點(diǎn)的encoding屬性決定。

當(dāng)我們知道一個(gè)指向某個(gè)節(jié)點(diǎn)起始地址的指針,那么通過這個(gè)指針以及這個(gè)節(jié)點(diǎn)的preivous_entry_length屬性,我們可以一直向前一個(gè)節(jié)點(diǎn)回溯,最終到達(dá)壓縮列表的表頭節(jié)點(diǎn)。

連鎖更新:

每個(gè)節(jié)點(diǎn)的preivous_entry_length屬性記錄前一個(gè)節(jié)點(diǎn)的長度

如果前一個(gè)節(jié)點(diǎn)長度小于254字節(jié),preivous_entry_length屬性需要用1字節(jié)長的空間來保存這個(gè)長度值

如果前一個(gè)節(jié)點(diǎn)長度大于等于254字節(jié),preivous_entry_length屬性需要用5字節(jié)長的空間來保存這個(gè)長度值

如果前一個(gè)節(jié)點(diǎn)長度變大,這個(gè)節(jié)點(diǎn)的preivous_entry_length就要擴(kuò)展,這個(gè)節(jié)點(diǎn)的擴(kuò)展引起下一個(gè)節(jié)點(diǎn)的擴(kuò)展,這就是連鎖更新

redis將這種在特殊情況下產(chǎn)生的連續(xù)多次空間擴(kuò)展操作稱之為連鎖更新

在添加新節(jié)點(diǎn)和刪除節(jié)點(diǎn)都可能引發(fā)連鎖更新。

連鎖更新最壞情況下需要對壓縮列表進(jìn)行N次空間重分配操作,每次空間重分配的最壞復(fù)雜度為O(N),所以連鎖更新的最壞復(fù)雜度為O(N的平方),平均復(fù)雜度為O(N)

總結(jié):

壓縮列表是為了節(jié)約內(nèi)存而開發(fā)的順序型數(shù)據(jù)結(jié)構(gòu),它是列表鍵和哈希鍵的底層實(shí)現(xiàn)之一,壓縮列表可以包含多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)可以保存一個(gè)字節(jié)數(shù)組或整數(shù)值,添加新節(jié)點(diǎn)或刪除節(jié)點(diǎn)可能引發(fā)連鎖更新操作,這種操作出現(xiàn)幾率不高。

到此這篇關(guān)于redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表 的文章就介紹到這了,更多相關(guān)redis壓縮列表 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • K8s部署Redis主從集群教程

    K8s部署Redis主從集群教程

    本文介紹了在Kubernetes環(huán)境下搭建Redis集群的詳細(xì)步驟,包括環(huán)境準(zhǔn)備、安裝NFS、創(chuàng)建PV卷、搭建Redis集群、集群初始化、主從切換測試以及開放外網(wǎng)端口等內(nèi)容
    2025-01-01
  • redis快速部署為docker容器的方法實(shí)現(xiàn)

    redis快速部署為docker容器的方法實(shí)現(xiàn)

    部署 Redis 作為 Docker 容器是一種快速、靈活且可重復(fù)使用的方式,特別適合開發(fā)、測試和部署環(huán)境,本文主要介紹了redis快速部署為docker容器的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄的示例代碼

    Redis實(shí)現(xiàn)短信驗(yàn)證碼登錄的示例代碼

    本文主要介紹了基于Redis如何實(shí)現(xiàn)短信驗(yàn)證碼登錄功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis Cluster集群數(shù)據(jù)分片機(jī)制原理

    Redis Cluster集群數(shù)據(jù)分片機(jī)制原理

    這篇文章主要介紹了Redis Cluster集群數(shù)據(jù)分片機(jī)制原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列

    基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列

    這篇文章主要介紹了基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列,需要的朋友可以參考下
    2015-11-11
  • Redis IP地址的綁定的實(shí)現(xiàn)

    Redis IP地址的綁定的實(shí)現(xiàn)

    這篇文章主要介紹了Redis IP地址的綁定的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Redis妙用之存儲用戶token問題

    Redis妙用之存儲用戶token問題

    這篇文章主要介紹了Redis妙用之存儲用戶token問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹

    Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹

    本文主要介紹了Redis中有序集合的內(nèi)部實(shí)現(xiàn)方式的詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis?整數(shù)集合的具體使用(intset)

    Redis?整數(shù)集合的具體使用(intset)

    對于集合,STL?的?set?相信大家都不陌生,本文主要介紹了整數(shù)集合,又稱為?intset,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Redis命令使用技巧之Keys的相關(guān)操作

    Redis命令使用技巧之Keys的相關(guān)操作

    Redis KEYS命令用于搜索具有匹配模式的鍵。下面這篇文章主要給大家介紹了關(guān)于Redis命令使用技巧之Keys的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10

最新評論

灵丘县| 湘潭县| 石城县| 淳化县| 高平市| 嘉义县| 桓台县| 富裕县| 江川县| 凌海市| 龙游县| 盐池县| 曲阜市| 历史| 丹阳市| 自贡市| 平陆县| 乐业县| 苗栗县| 长春市| 霍林郭勒市| 福清市| 林芝县| 莱芜市| 平度市| 建始县| 衡阳县| 长春市| 八宿县| 来宾市| 大姚县| 久治县| 子洲县| 东台市| 马龙县| 阿城市| 华坪县| 孝感市| 黄陵县| 寻甸| 长沙县|