有序集合每個字串元素都關聯到一個雙精度64位的浮點型數字字串score,里面的元素總是通過score進行著排序,因此它是可以檢索的一系列元素
默認升序排列,即通過命令ZRANGE實作;如果要按照降序排列,需要通過命令ZREVRANGE實作
當score即得分一樣時,按照字典順序對member進行排序,字典排序用的是二進制,它比較的是字串的位元組陣列,所以實際上是比較ASCII碼
底層結構
Ziplist
有序集合物件的編碼可以是ziplist或者skiplist,同時滿足以下條件時使用ziplist編碼:
- 元素數量小于128個
- 所有member的長度都小于64位元組
以上兩個條件的上限值可通過zset-max-ziplist-entries和zset-max-ziplist-value來修改
ziplist編碼的有序集合使用緊挨在一起的壓縮串列節點來保存,第一個節點保存member,第二個保存score
ziplist內的集合元素按score從小到大排序,score較小的排在表頭位置
Skiplist
skiplist編碼的有序集合底層是一個命名為zset的結構體,而一個zset結構同時包含一個字典和一個跳躍表
跳躍表按score從小到大保存所有集合元素,而字典則保存著從member到score的映射,這樣就可以用O(1)的復雜度來查找member對應的score值,雖然同時使用兩種結構,但它們會通過指標來共享相同元素的member和score,因此不會浪費額外的記憶體
向有序集合中添加score和element 時間復雜度 O(logN)
獲取element的分數 時間復雜度O(1)
自增element的分數 時間復雜度O(1)
回傳有序集合中元素的個數 時間復雜度O(1)
多維度排序
以手機應用商店的熱門榜單排序為例:首先按照APP的下載量倒序排序,如果下載量一樣,則按照最后更新時間倒序排列
SortedSet排序因子score,它是一個雙精度64位的浮點型數字字串
我們如何實作多維度排序?
構造一個特殊的score,以這個案例為例,排序影響因子是下載量和更新時間,那么我們可以構造一個這樣特殊的浮點型別的score:整數部分就是下載量,小數部分就是最后更新時間戳
假設有5個app的下載量和最后更新時間分別如下(說明:更新時間只精確到秒):
wechat-下載量:12000000,最后更新時間:1564022201;其score為:12000000.1564022201
qq-下載量:12000000,最后更新時間:1564022222;其score為:12000000.1564022222
tiktok-下載量:9808900,最后更新時間:1563552267;其score為:9808900.1563552267
taobao-下載量:11006600,最后更新時間:1564345601;其score為:11006600.1564345601
alipay-下載量:11006600,最后更新時間:1564345600;其score為:11006600.1564345600
接下來,我們通過如下命令將這5個APP用SortedSet資料型別保存到Redis中:
zadd TopApp 12000000.1564022201 wechat 12000000.1564022222 qq 9808900.1563552267 tiktok 11006600.1564345601 taobao 11006600.1564345600 alipay
保存后,我們看一下排序結果是否符合我們的預期:
127.0.0.1:6379> zrevrange TopApp 0 -1
1) "qq"
2) "wechat"
3) "taobao"
4) "alipay"
5) "tiktok"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/199490.html
標籤:java
上一篇:Fabric-java-sdk 開通TLS時訪問Fabric網路
下一篇:Markdown筆記測驗
