一、SortedSet概念
SortedSet是Redis提供的一種有序數據結構,其內部是一個跳錶加哈希表的結構。跳錶可以提供在O(logN)的時間複雜度下插入、刪除和查詢數據,同時其支持範圍查詢,這與我們使用的傳統哈希表不同。SortedSet內部的數據通過一個score進行了排序,提供了一種當需要排序的數據比較少,並且需要有範圍查詢的情況下非常好用的解決方案。
二、SortedSet的API
1、添加元素
// 添加元素,score為排序值 zadd key score member [score member ...]
添加元素時,如果元素不存在,則插入並返回1;如果元素存在,則僅更新它的score值,並返回0。
2、刪除元素
// 刪除元素 zrem key member [member ...]
刪除成功時返回1,刪除失敗或元素不存在返回0。
3、獲取元素score值
// 獲取元素score值 zscore key member
如果元素存在,則返回它的score值,否則返回null。
4、獲取元素排名
// 獲取元素的排名,排名從0開始,zrevrank獲取倒序排名 zrank key member
如果元素存在,則返回它的排名,否則返回null。
5、獲取元素分數範圍內的數量
// 獲取元素分數在min到max範圍內的個數,包括min、max zcount key min max
如果min>max,則返回0。
6、獲取指定排名區間的元素
// 獲取排名在start到end區間內的所有元素,含start、end zrange key start end [WITHSCORES]
如果start大於end,則返回一個空列表。
WITHSCORES選項表示除了元素外,還返回每個元素的score值。
7、獲取指定分數區間的元素
// 獲取score在min到max之間的所有元素,含min、max,zrevrange獲取倒序 zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
如果min>max,則返回一個空列表。
LIMIT用於指定返回結果區間的偏移量和數量,默認返回所有符合條件的結果。
三、SortedSet的應用
1、排行榜
SortedSet非常適合用於排行榜的實現。使用SortedSet來存儲用戶得分等信息,並通過zrevrange按分數從高到低獲取排行榜,還可以用zrank、zscore獲取用戶的排名和分數。
2、新聞發布
SortedSet也可以用於新聞發布的實現,使用score存儲新聞發布時間的時間戳,value存儲新聞內容,這樣可以使用zrangebyscore按時間範圍獲取新聞,還能夠使用zscore獲取某條新聞發布的時間。
3、任務調度
在分布式系統中,任務調度可能面對大量的任務,SortedSet可以用於存儲調度任務,使用score存儲任務的執行時間戳,value存儲任務內容,這樣就可以用zrangebyscore獲取即將要執行的任務,確保任務的及時性。
四、SortedSet注意事項
1、數據量
SortedSet可以應對數百萬,甚至上億的數據,但過大的數據量會導致慢查詢。
2、排序算法
SortedSet使用跳錶實現排序,雖然時間複雜度上能應對大部分場景,但還有可能會因操作的複雜度影響速度。
3、浮點數處理
redis中score存儲的是浮點數,但是在比較時會因浮點數跨越不準確導致排序錯誤,需注意。
4、相同得分元素的排序
相同得分的元素,根據字典序排序。如果需要多個元素的共同score怎麼辦呢?可以將score設計為score+時間戳這樣的複合方式,來確保元素的順序是唯一的。
原創文章,作者:GNCBO,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324869.html