Redis有序集合的編碼可以是 ziplist 或者 skiplist
ziplist和skiplist編碼選擇的標(biāo)準(zhǔn)在于Redis里的元素的數(shù)量以及元素成員的長度攒砖。
當(dāng)滿足以下2個(gè)條件時(shí),元素會(huì)選擇ziplist編碼:
① 有序集合保存的元素?cái)?shù)量小于128個(gè)
② 有序集合保存的所有元素成員的長度小于64字節(jié)
當(dāng)條件不滿足的時(shí)候日裙,ziplist可以向skiplist轉(zhuǎn)換吹艇。
ziplist:
ziplist編碼的有序集合對(duì)象使用壓縮列表作為底層實(shí)現(xiàn)。每個(gè)集合使用2個(gè)緊挨在一起的壓縮列表節(jié)點(diǎn)來保存昂拂,第一個(gè)保存元素的成員受神,第二個(gè)保存元素的分值。壓縮列表內(nèi)的集合按分值從小到大排序格侯,分值較小的元素被放置在靠近表頭的位置联四,分值較大的元素在靠近表尾的位置醉拓。
skiplist:
skiplist編碼的有序集合對(duì)象使用 zset結(jié)構(gòu)作為底層實(shí)現(xiàn),zset結(jié)構(gòu)同時(shí)包含一個(gè)字典和一個(gè)跳躍表排吴。
zset結(jié)構(gòu)的zsl跳躍表按分值從小到大保存了所有集合元素屹堰,每個(gè)跳躍表都保存了一個(gè)集合元素:跳躍表節(jié)點(diǎn)的object屬性保存了元素的成員淑趾,而跳躍表節(jié)點(diǎn)的score屬性保存了元素的分值扣泊。
從了zsl, zset里還保存了一個(gè)從成員到分值的映射评矩。
為什么有序集合需要同時(shí)使用跳躍表和字典來實(shí)現(xiàn)?
跳躍表利于執(zhí)行范圍操作(跳躍表是排好序的)蔗喂,而字典有利于執(zhí)行分值查找操作。同時(shí)由于Redis里的跳躍表和字典元素很多都是用指針實(shí)現(xiàn)的乖阵,所以不會(huì)浪費(fèi)內(nèi)存。
壓縮列表和跳躍表之間的區(qū)別对蒲?
壓縮列表是Redis為了節(jié)約內(nèi)存而開發(fā)的。是由一系列特殊編碼的連續(xù)內(nèi)存塊組成的順序型存儲(chǔ)結(jié)構(gòu)。當(dāng)一個(gè)列表鍵只包含少量列表項(xiàng)谈况,并且每個(gè)列表項(xiàng)要么是小整數(shù)值赡茸,要么是長度比較小的字符串占卧,Redis就會(huì)用壓縮列表作為其底層實(shí)現(xiàn)。
跳躍表是一種有序數(shù)據(jù)結(jié)構(gòu)叭喜。它通過在每個(gè)節(jié)點(diǎn)中維持多個(gè)指向其它節(jié)點(diǎn)的指針,從而達(dá)到快速訪問節(jié)點(diǎn)的目的啥辨。