Redis有序集合原理

簡介

有序集合是一個數據類型和集合和hash表很類似,數據是不重複的。因爲集合中的元素是沒有排序的,所以有序集合中的每一個元素都和一個浮點型數字關聯起來,這個浮點型數字叫作score(因此它和hash很像)。
有序集合內的元素是按照如下規則排序的。
① A和B是2個分數不一樣的元素。若是A的分數大於B的分數,那麼A>B。
② 若是A和B分數相同,那麼當A的字符串詞典順序比B的到時候,A>B(A和B的字符串不可能相等)。redis

有序集合實現

Redis有序集合中的元素的編碼能夠是 ziplist 或者 skiplist。ziplist和skiplist編碼選擇的標準在於Redis裏的元素的數量以及元素成員的長度。當知足如下2個條件時,元素編碼爲ziplist:
① 有序集合保存的元素數量小於128個
② 有序集合保存的全部元素成員的長度小於64字節數據結構

同時當條件不知足的時候,ziplist能夠向skiplist轉換。編碼

如下將具體介紹ziplist和skiplist編碼的底層實現。
ziplist:
ziplist編碼的有序集合對象使用壓縮列表做爲底層實現。每一個集合使用2個緊挨在一塊兒的壓縮列表節點來保存,第一個保存元素的成員,第二個保存元素的分值。壓縮列表內的集合按分值從小到大排序,分值較小的元素被放置在靠近表頭的位置,分值較大的元素在靠近表尾的位置。設計

skiplist:
skiplist編碼的有序集合對象使用 zset結構做爲底層實現,zset結構同時包含一個字典和一個跳躍表。
zset結構的zsl跳躍表按分值從小到大保存了全部集合元素,每一個跳躍表都保存了一個集合元素:跳躍表節點的object屬性保存了元素的成員,而跳躍表節點的score屬性保存了元素的分值。
從了zsl, zset裏還保存了一個從成員到分值的映射。指針

思考

1 爲何有序集合須要同時使用跳躍表和字典來實現?
跳躍表利於執行範圍操做(跳躍表是排好序的),而字典有利於執行分值查找操做。同時因爲Redis裏的跳躍表和字典元素不少都是用指針實現的,因此不會浪費內存。對象

2 壓縮列表和跳躍表之間的區別?
壓縮列表是Redis爲了節約內存而開發的。是由一系列特殊編碼的連續內存塊組成的順序型存儲結構。當一個列表鍵只包含少許列表項,而且每一個列表項要麼是小整數值,要麼是長度比較小的字符串,Redis就會用壓縮列表做爲其底層實現。
跳躍表是一種有序數據結構。它經過在每一個節點中維持多個指向其它節點的指針,從而達到快速訪問節點的目的。排序

參考文檔:
redis官方文檔
《redis設計與實現》ip

相關文章
相關標籤/搜索