redis有5種數據類型,包括:redis
和集合同樣,有序集合也是 string 類型元素的集合,且元素不容許重複。不一樣的是,有序集合的每一個元素都會關聯一個 double 類型的分數(score)。redis 經過分數來爲集合中的成員進行從小到大的排序。ide
有序集合的成員是惟一的,但分數卻能夠重複。性能
有序集合查找任意數據的時間複雜度是O(1),插入、刪除操做的時間複雜度是O(logN)。設計
因爲有序集合能夠根據分數對元素進行排序,所以有序集合可用於排行榜、學生成績排名等用途。3d
出於對性能的考慮,有序集合底層有兩類實現:指針
ziplist(壓縮列表)實現的有序集合對象中,每一個元素是用須要使用兩個連續的壓縮列表節點保存,第一個節點保存元素的成員,第二個節點保存元素的分值,分值爲double 類型。對象
壓縮列表內的元素,會按照分值,從小到大排序。若是分值相同,則按照元素成員的大小,從小到大排序。大體以下圖所示:blog
skiplist(跳躍表)採用了鏈表加多級索引的結構。它使用了空間換時間的設計思路,在存儲時創建了不少級索引。使得在跳躍表中查找、插入和刪除的時間複雜度都是O(logN)。排序
它的實現大體以下圖所示:索引
有序列表使用skiplist(跳躍表)+字典實現,是爲了保證查找和範圍型操做(ZRANK、ZRANGE等)都能儘量快的執行。
例如只使用跳躍表,查找單個成員,複雜度爲O(logN)。
例如只使用字典,因爲字典是無序的,範圍型的操做,會須要使用至少O(NlogN)時間複雜度和額外的O(N)空間對數據排序,再進行範圍型操做。
而同時使用跳躍表+字典,查找單個成員,能夠直接在字典中查找,複雜度爲O(1),範圍型操做則在跳躍表中操做,複雜度爲O(lngN)。