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

Redis數(shù)據(jù)結(jié)構(gòu)ZipList,QuickList,SkipList使用及說(shuō)明

 更新時(shí)間:2026年04月30日 09:11:40   作者:Nova??  
文章介紹了ZipList數(shù)據(jù)結(jié)構(gòu)及其在Redis中的應(yīng)用,詳細(xì)解釋了其緊湊的內(nèi)存存儲(chǔ)方式和特點(diǎn)和應(yīng)用場(chǎng)景,同時(shí)探討了QuickList及其在Redis中的作用,以及不同數(shù)據(jù)類(lèi)型的編碼方式和應(yīng)用場(chǎng)景

1.ZipList

redis中的ZipList是一種緊湊的內(nèi)存儲(chǔ)存結(jié)構(gòu),主要可以節(jié)省內(nèi)存空間儲(chǔ)存小規(guī)模數(shù)據(jù)。是一種特殊的雙端鏈表,有一系列連續(xù)的內(nèi)存組成,可以在任意一端進(jìn)行壓入/彈出操作,而且操作的時(shí)間復(fù)雜度為O(1)

常見(jiàn)方法:

LPUSH mylist "value1" "value2"    //左邊插入
RPUSH mylist "value3" "value4"    //右邊插入

LPOP mylist    //從鏈表最左端彈出數(shù)據(jù)
RPOP mylist    //從鏈表最右端彈出數(shù)據(jù)

LRANGE mylist 0 2    //獲取左邊指定范圍的數(shù)據(jù)
LINDEX mylist 0    //獲取指定下標(biāo)數(shù)據(jù)

LLEN mylist    //獲取列表長(zhǎng)度
zlbyteszltailzllenentry

...

entryentryzlend
屬性類(lèi)型長(zhǎng)度用途
zlbytesuint32_t4字節(jié)記錄整個(gè)壓縮鏈表占用的內(nèi)存字節(jié)數(shù)
zltailuint32_t4字節(jié)這個(gè)是偏移量,記錄壓縮列表尾節(jié)點(diǎn)到列表起始地址有多少字節(jié),通過(guò)這個(gè)偏移量,可以確定尾節(jié)點(diǎn)地址
zllenuint16_t2字節(jié)記錄列表包含的節(jié)點(diǎn)數(shù)量。最大65534,如果超出也只是65535
entry列表節(jié)點(diǎn)不定各個(gè)節(jié)點(diǎn)的長(zhǎng)度由節(jié)點(diǎn)保存的內(nèi)容確定
zlenduint8_t1字節(jié)特殊值0xFF(255),用于標(biāo)記壓縮例表的末端

1.2.解析Entry

ZipList的Entry不像普通鏈表那樣記錄前后節(jié)點(diǎn)的指針,因?yàn)橛涗浨昂蠊?jié)點(diǎn)指針需要16字節(jié),大大浪費(fèi)了內(nèi)存。所以采用下面的結(jié)構(gòu)來(lái)保存。

previous_entry_lengthencoding

content

1.previous_entry_length:前一節(jié)點(diǎn)的長(zhǎng)度,占1字節(jié) 或 5字節(jié)

當(dāng)前一節(jié)點(diǎn)長(zhǎng)度 < 254字節(jié),采用 1字節(jié)保存這個(gè)長(zhǎng)度值

當(dāng)前一節(jié)點(diǎn)的長(zhǎng)度 > 254字節(jié),采用5字節(jié)保存這個(gè)長(zhǎng)度值

2.encoding:編碼屬性,記錄content的數(shù)據(jù)類(lèi)型(數(shù)字/字符串)及長(zhǎng)度,占用1,2,5字節(jié)。

3.contents:負(fù)責(zé)保存具體的內(nèi)容,可以是數(shù)字可以是字符串

注意:ZipList中所有儲(chǔ)存長(zhǎng)度的數(shù)值均采用小端字節(jié)序儲(chǔ)存,低位在前,高位字節(jié)在后。

列如:0x1234,采用小端字節(jié)序后就是 0x3412

1.3Encoding編碼

encoding編碼分為兩種:字符串和數(shù)字

字符串:encoding以00,01,10開(kāi)頭標(biāo)識(shí)儲(chǔ)存的是字符串。

下面長(zhǎng)度不同的字符串對(duì)應(yīng)encoding編碼格式

舉例:儲(chǔ)存字符串a(chǎn)b,bc

1.4.ZipList連鎖更新問(wèn)題

ZipList的每個(gè)Entry都包含previous_entry_length來(lái)記錄上一節(jié)點(diǎn)大小,長(zhǎng)度為1個(gè)或5字節(jié)。

>>如果前一節(jié)點(diǎn)長(zhǎng)度 < 254,那么采用1字節(jié)保存這個(gè)長(zhǎng)度值。

>>如果前一節(jié)點(diǎn) >= 254,則采用5字節(jié)保存這個(gè)長(zhǎng)度值。

如果有N個(gè)連續(xù)的長(zhǎng)度為250~253之間的entry,如果不巧有一個(gè)擴(kuò)展那么又可能發(fā)生連鎖反應(yīng),又可能所有都發(fā)生連鎖更新,新增,刪除都可能導(dǎo)致連鎖更新發(fā)生。

總結(jié):

1.壓縮列表可以看作連續(xù)內(nèi)存空間的“雙向鏈表“

2.列表的節(jié)點(diǎn)之間不是通過(guò)指針鏈接,而是上一節(jié)點(diǎn)和本節(jié)點(diǎn)長(zhǎng)度來(lái)尋址,大大節(jié)省內(nèi)存

3.如果數(shù)據(jù)過(guò)多,鏈表過(guò)長(zhǎng),可能影響查詢性能

4.增加刪除都可能發(fā)生連續(xù)更新問(wèn)題

2.QuickList

ZIpList雖然節(jié)省內(nèi)存,但是申請(qǐng)內(nèi)存必須是連續(xù)空間,如果內(nèi)存占用過(guò)多那么申請(qǐng)效率變低

數(shù)據(jù)量過(guò)大超出上限采用分片儲(chǔ)存數(shù)據(jù),那么這些ZipList如何聯(lián)系?

Redis3.2版本引入QuickList,是一個(gè)雙端鏈表,只不過(guò)每個(gè)節(jié)點(diǎn)都是ZipList

Redis提供配置:list-max-ziplist-size 

如果值是正:代表ZipList允許的最大entry數(shù)。

如果值是負(fù):代表每個(gè)ZipList的最大內(nèi)存大小。

-1-2-3-4-5
4kb8kb16kb32kb64kb

QuickList可以控制首尾是否進(jìn)行壓縮,通過(guò)配置項(xiàng)list-compress-depth來(lái)控制,這個(gè)參數(shù)是控制首尾不壓縮的節(jié)點(diǎn)個(gè)數(shù)。

012
代表首尾節(jié)點(diǎn)不壓縮首尾各有一個(gè)1個(gè)不壓縮,中間全壓縮首尾各有2節(jié)點(diǎn)不壓縮,中間全壓縮

QuickList 和 Quick List Node的結(jié)構(gòu)源碼:

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

QuickList特性:

1.每個(gè)節(jié)點(diǎn)都是ZipList的雙端鏈表

2.節(jié)點(diǎn)采用ZipList,解決傳統(tǒng)鏈表的內(nèi)存占用

3.控制ZipList大小,解決傳統(tǒng)連續(xù)內(nèi)存空間申請(qǐng)問(wèn)題

4.中間節(jié)點(diǎn)可壓縮,節(jié)省內(nèi)存

SkipList跳表

是個(gè)鏈表,但不是普通鏈表,不同節(jié)點(diǎn)之間跨度不一樣。

1.元素按照升序排列儲(chǔ)存

2.節(jié)點(diǎn)可能包含多個(gè)指針,指針跨度不同

為了更快的找到所需要的元素,SkipList采用這種結(jié)構(gòu)類(lèi)似于二分查找。

以下是結(jié)構(gòu)源碼:

// t_zset.c
typedef struct zskiplist {
	// 頭尾節(jié)點(diǎn)指針
	struct zskiplistNode* header, * tail;
	// 節(jié)點(diǎn)數(shù)量
	unsigned long length;
	// 最大的索引層級(jí),默認(rèn)是1
	int level;
} zskiplist;

// t_zset.c
typedef struct zskiplistNode {
	sds ele; // 節(jié)點(diǎn)存儲(chǔ)的值
	double score;// 節(jié)點(diǎn)分?jǐn)?shù),排序、查找用
	struct zskiplistNode* backward; // 前一個(gè)節(jié)點(diǎn)指針
	struct zskiplistLevel {
		struct zskiplistNode* forward; // 下一個(gè)節(jié)點(diǎn)指針
		unsigned long span; // 索引跨度
	} level[]; // 多級(jí)索引數(shù)組
} zskiplistNode;

特性:

1.跳表是一個(gè)雙向鏈表,每個(gè)節(jié)點(diǎn)包含存儲(chǔ)的值和排序用的socre,用來(lái)保存別的節(jié)點(diǎn)的ele數(shù)組

2.節(jié)點(diǎn)按照score值排序,score值一樣按照ele字典排序

3.每層指針到下一節(jié)點(diǎn)跨度不同,層級(jí)越高跨度越大

4.增刪改查的效率與紅黑樹(shù)基本一致

RedisObject

在Redis中任意數(shù)據(jù)類(lèi)型的鍵和值都會(huì)被封裝在一個(gè)RedisObject中,也叫做Redis對(duì)象。

Redis會(huì)根據(jù)儲(chǔ)存不同的數(shù)據(jù)類(lèi)型選擇不同的編碼格式,共包含11種不同類(lèi)型。

編號(hào)編碼方式說(shuō)明
0OBJ_ENCODING_RAW動(dòng)態(tài)字符串(動(dòng)態(tài)長(zhǎng)度,非預(yù)分配)
1OBJ_ENCODING_INT長(zhǎng)整型(用 long 類(lèi)型存儲(chǔ))
2OBJ_ENCODING_HT哈希表(字典,基于 dict 實(shí)現(xiàn))
3OBJ_ENCODING_ZIPMAP已廢棄的哈希壓縮結(jié)構(gòu)
4OBJ_ENCODING_LINKEDLIST雙端鏈表(舊版 List 實(shí)現(xiàn))
5OBJ_ENCODING_ZIPLIST壓縮列表(緊湊的二進(jìn)制結(jié)構(gòu))
6OBJ_ENCODING_INTSET整數(shù)集合(僅存儲(chǔ)整數(shù)的有序集合)
7OBJ_ENCODING_SKIPLIST跳表(有序集合的底層實(shí)現(xiàn)之一)
8OBJ_ENCODING_EMBSTR短字符串(固定長(zhǎng)度,預(yù)分配內(nèi)存)
9OBJ_ENCODING_QUICKLIST快速列表(雙向鏈表 + 壓縮列表)
10OBJ_ENCODING_STREAMStream 流(消息隊(duì)列結(jié)構(gòu))

五種數(shù)據(jù)類(lèi)型

String基于簡(jiǎn)單動(dòng)態(tài)字符串SDS實(shí)現(xiàn),存儲(chǔ)上限為512mb,基本編碼方式是RAM

List可以從首尾操作列表中的元素,3.2版本后統(tǒng)一采用QuickList來(lái)實(shí)現(xiàn)List

Set:

1.為了查詢效率和唯一性,采用Dict編碼,key為存儲(chǔ)元素,value統(tǒng)一為null

2.所有數(shù)據(jù)都是整數(shù),且元素?cái)?shù)量不超過(guò)set-max-intset-entries,Set會(huì)采用IntSet編碼

ZSet:

ZSet就是SortedSet,其中每個(gè)元素都需指定一個(gè)score 和 member值

可以根據(jù)score排序,且member必須唯一,可以根據(jù)member查詢分?jǐn)?shù)

當(dāng)元素?cái)?shù)數(shù)量小時(shí),采用ZipList來(lái)節(jié)省內(nèi)存,但是需要滿足兩個(gè)條件:

1.元素?cái)?shù)量小于 zset_max_ziplist_entries (128)

2.每個(gè)元素都小于zset_max_ziplist_value(64)

當(dāng)數(shù)據(jù)量大時(shí)采用SkipList和HT結(jié)構(gòu)

Hash:

hash底層的編碼和ZSet基本一致,只需要把排序有關(guān)的SkipList去掉就行。

1.數(shù)據(jù)量小時(shí),采用ZipList編碼節(jié)省內(nèi)存,ZipList中相鄰的兩個(gè)entry保存field和value

2.數(shù)據(jù)量大時(shí),采用HT編碼,就是Dict,觸發(fā)條件是:元素?cái)?shù)量超過(guò)512,每個(gè)entry超過(guò)64字節(jié)

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis分布式鎖的問(wèn)題與解決方法

    redis分布式鎖的問(wèn)題與解決方法

    這篇文章主要給大家介紹了關(guān)于redis分布式鎖的問(wèn)題與解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Redis中3種特殊的數(shù)據(jù)類(lèi)型(BitMap、Geo和HyperLogLog)

    Redis中3種特殊的數(shù)據(jù)類(lèi)型(BitMap、Geo和HyperLogLog)

    這篇文章主要給大家介紹了關(guān)于Redis中3種特殊的數(shù)據(jù)類(lèi)型(BitMap、GEOADD和GEODIST)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Redis 緩存滿了如何解決

    Redis 緩存滿了如何解決

    Redis 緩存使用內(nèi)存來(lái)保存數(shù)據(jù),隨著需要緩存的數(shù)據(jù)量越來(lái)越大,有限的緩存空間不可避免地會(huì)被寫(xiě)滿,本文主要介紹了Redis 緩存滿了如何解決,感興趣的可以了解一下
    2023-08-08
  • Redis SETEX命令實(shí)現(xiàn)鍵值對(duì)管理

    Redis SETEX命令實(shí)現(xiàn)鍵值對(duì)管理

    本文主要介紹了Redis SETEX命令實(shí)現(xiàn)鍵值對(duì)管理,SETEX命令用于設(shè)置具有過(guò)期時(shí)間的鍵值對(duì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 淺談Redis Key 命名規(guī)范文檔

    淺談Redis Key 命名規(guī)范文檔

    本文介紹了Redis鍵名命名規(guī)范,包括命名格式、具體規(guī)范、數(shù)據(jù)類(lèi)型擴(kuò)展命名、時(shí)間敏感型鍵名、規(guī)范總結(jié)以及實(shí)際應(yīng)用示例,感興趣的可以了解一下
    2025-05-05
  • Redis主從復(fù)制分步講解使用

    Redis主從復(fù)制分步講解使用

    Redis因?yàn)槠涓咝阅芎鸵子眯栽谖覀兒蠖说姆?wù)中發(fā)揮了巨大的作用,并且很多重要功能的實(shí)現(xiàn)都會(huì)依賴(lài)redis,本篇我們來(lái)了解Redis高可用主從復(fù)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-09-09
  • 關(guān)于Redis未授權(quán)訪問(wèn)的問(wèn)題

    關(guān)于Redis未授權(quán)訪問(wèn)的問(wèn)題

    這篇文章主要介紹了Redis未授權(quán)訪問(wèn)的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Redis Stream類(lèi)型的使用詳解

    Redis Stream類(lèi)型的使用詳解

    本文主要介紹了Redis Stream類(lèi)型的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 分布式爬蟲(chóng)處理Redis里的數(shù)據(jù)操作步驟

    分布式爬蟲(chóng)處理Redis里的數(shù)據(jù)操作步驟

    這篇文章主要介紹了分布式爬蟲(chóng)處理Redis里的數(shù)據(jù)操作步驟,數(shù)據(jù)分別存入mongodb和mysql數(shù)據(jù)庫(kù),具體內(nèi)容詳情及實(shí)例代碼大家參考下本文
    2018-03-03
  • redis字符串類(lèi)型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis字符串類(lèi)型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了redis字符串類(lèi)型的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

巫溪县| 华池县| 巴东县| 临颍县| 台北市| 莱西市| 屯留县| 华坪县| 台北市| 买车| 东至县| 邵阳市| 霞浦县| 丽水市| 邮箱| 瓮安县| 玉门市| 稻城县| 牙克石市| 秀山| 西吉县| 瑞昌市| 循化| 新巴尔虎右旗| 平利县| 夏津县| 绵阳市| 厦门市| 三穗县| 宣威市| 阜阳市| 平乐县| 北流市| 淮阳县| 宜章县| 林芝县| 邵阳市| 博罗县| 田阳县| 建始县| 萍乡市|