1.3. 有序集合(sorted set) ZSET
1.3.1. 簡介
- Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員。
- 不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。
- 有序集合的成員是唯一的,但分數(score)卻可以重複。
- 集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。 集合中最大的成員數爲 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
Redis的ZSet是有序、且不重複
(很多時候,我們都將redis中的有序集合叫做zsets,這是因爲在redis中,有序集合相關的操作指令都是以z開頭的)
1.3.2. 命令
賦值語法:
- ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數
取值語法:
- ZCARD key 獲取有序集合的成員數
- ZCOUNT key min max 計算在有序集合中指定區間分數的成員數
- ZRANK key member 返回有序集合中指定成員的索引
- ZRANGE key start stop [WITHSCORES]
通過索引區間返回有序集合成指定區間內的成員(低到高)
- ZRANGEBYSCORE key min max [WITHSCORES ] [LIMIT] ,通過分數返回有序集合指定區間的成員
- ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定區間內的成員,通過索引,分數從高到底
- ZREVRANGEBYSCORE key max min [WITHSCORES] ,返回有序集合中指定分數區間的成員,分數從高到低排序
刪除語法:
- del key 移除集合
- ZREM key member [member …] 移除有序集合中的一個或多個成員
- ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區間的所有成員(第一名是0)(低到高排序)
- ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員
- ZINCRBY key increment member 增加member元素的分數increment,返回值是更改後的分數
1.3.3. 應用場景
常應用於:排行榜
-
比如twitter 的public timeline可以以發表時間作爲score來存儲,這樣獲取時就是自動按時間排好序的。
-
比如一個存儲全班同學成績的Sorted Set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。
-
還可以用Sorted Set來做帶權重的隊列,比如普通消息的score爲1,重要消息的score爲2,然後工作線程可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。