<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
面試官:Redis中基本的資料型別有哪些?
我:Redis的基本資料型別有:字串(string)、雜湊(hash)、列表(list)、集合(set)、有序集合(zset)。
面試官:有序集合的內部實現方式是什麼?
我還沉浸在上一個問題的沾沾自喜中,頓時表情凝固了,手心開始冒出冷汗。“這個。。沒有太深入瞭解”,我支支吾吾的說到。
面試官:回去等訊息吧。
這句話說的乾淨利落,然後就沒有然後了。失敗是成功的媽媽,我不氣餒,決定馬上惡補一下。
有序集合的內部實現有兩種,分別是:壓縮列表(ziplist)和跳躍表(skiplist)。接下來,我們分別進行詳細的瞭解。
當有序集合的元素個數小於zset-max-ziplist-entries
(預設為128個),並且每個元素成員的長度小於zset-max-ziplist-value
(預設為64位元組)的時候,使用壓縮列表作為有序集合的內部實現。
每個集合元素由兩個緊挨在一起的兩個壓縮列表結點組成,其中第一個結點儲存元素的成員,第二個結點儲存元素的分支。壓縮列表中的元素按照分數從小到大依次緊挨著排列,有效減少了記憶體空間的使用。
舉個例子,我們使用zadd
命令建立一個以壓縮列表為實現的有序集合:
127.0.0.1:6379> zadd one-more-zset 1 one 2 two 3 three (integer) 3 127.0.0.1:6379> zrange one-more-zset 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> object encoding one-more-zset "ziplist"
當有序集合的元素個數大於等於zset-max-ziplist-entries
(預設為128個),或者每個元素成員的長度大於等於zset-max-ziplist-value
(預設為64位元組)的時候,使用跳躍表作為有序集合的內部實現。
此時,在有序集合中其實包含了兩個結構,一個是跳躍表,另一個是雜湊表。
在跳躍表中,所有元素按照從小到大的順序排列。跳躍表的結點中的object
指標指向元素成員的字串物件,score
儲存了元素的分數。通過跳躍表,Redis可以快速地對有序集合進行分數範圍、排名等操作。
在雜湊表中,為有序集合建立了一個從元素成員到元素分數的對映。鍵值對中的鍵指向元素成員的字串物件,鍵值對中的值儲存了元素的分數。通過雜湊表,Redis可以快速查詢指定元素的分數。
雖然有序集合同時使用跳躍表和雜湊表,但是這兩種資料結構都使用指標共用元素中的成員和分數,不會額外的記憶體浪費。
舉個例子,我們使用zadd
命令建立一個以跳躍表為實現的有序集合:
127.0.0.1:6379> zadd one-more-zset 1 long-long-long-long-long-long-long-long-long-long-long-long-long-long (integer) 1 127.0.0.1:6379> zrange one-more-zset 0 -1 1) "long-long-long-long-long-long-long-long-long-long-long-long-long-long" 127.0.0.1:6379> object encoding one-more-zset "skiplist"
當一個有序集合是以壓縮列表作為內部實現時,再向這個有序集合新增較長的元素成員,或向這個有序集合的元素個數過多時,那麼這個有序集合就會轉換為以跳躍表作為內部實現。但是,以跳躍表作為內部實現的有序集合不會轉換為以壓縮列表作為內部實現。
舉個例子,我們先建立一個以壓縮列表作為內部實現的有序集合:
127.0.0.1:6379> zadd one-more-zset 1 one 2 two 3 three (integer) 3 127.0.0.1:6379> zrange one-more-zset 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> object encoding one-more-zset "ziplist"
然後,再向它新增一個較長成員的元素,它就是轉換為以跳躍表作為內部實現:
127.0.0.1:6379> zadd one-more-zset 4 long-long-long-long-long-long-long-long-long-long-long-long-long-long (integer) 1 127.0.0.1:6379> zrange one-more-zset 0 -1 1) "one" 2) "two" 3) "three" 4) "long-long-long-long-long-long-long-long-long-long-long-long-long-long" 127.0.0.1:6379> object encoding one-more-zset "skiplist"
然後,再把那一個較長成員的元素從有序集合中移除,有序集合依然是以跳躍表作為內部實現:
127.0.0.1:6379> zrem one-more-zset long-long-long-long-long-long-long-long-long-long-long-long-long-long (integer) 1 127.0.0.1:6379> zrange one-more-zset 0 -1 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> object encoding one-more-zset "skiplist"
在Redis中,有序集合的內部實現有壓縮列表(ziplist)和跳躍表(skiplist)兩種,當集合中的所有元素的成員長度較短並元素個數較少時,使用壓縮列表作為內部實現,否則使用跳躍表和雜湊表作為內部實現。當條件不滿足時,壓縮列表可以轉換為跳躍表,但跳躍表不能轉換為壓縮列表。
到此這篇關於Redis中有序集合的內部實現方式的詳細介紹的文章就介紹到這了,更多相關Redis有序集合的內部實現內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45