有序集合(ZSET):
可以用作相關有序集合相對于哈希、列表、集合來說會有一點點陌生,但既然叫有序集合,那么它和集合必然有著聯系,它保留了集合不能有重復成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為排序依據不同的是,它給每個元素設置一個分數( score)作為排序的依據。
有序集合中的元素不能重復,但是score可以重復,就和一個班里的同學學號不能重復,但是考試成績可以相同。
有序集合提供了獲取指定分數和元素范圍查詢、計算成員排名等功能,合理的利用有序集合,能幫助我們在實際開發中解決很多問題。
使用場景
有序集合比較典型的使用場景就是排行榜系統。例如視頻網站需要對用戶上傳的視頻做排行榜,榜單的維度可能是多個方面的:按照時間、按照播放數量、按照獲得的贊數。
【補充】但是實際zrank進行排名,是異步定時執行的,不會進行每秒進行算一次,因為算一次消耗很大。
集合內操作命令
zadd添加成員
返回結果代表成功添加成員的個數
要注意:
zadd命令還有四個選項nx、xx、ch、incr 四個選項
nx: member必須不存在,才可以設置成功,用于添加。
xx: member必須存在,才可以設置成功,用于更新。
ch: 返回此次操作后,有序集合元素和分數發生變化的個數
incr: 對score做增加,相當于后面介紹的zincrby
zcard 計算成員個數
zscore 計算某個成員的分數【常用】
如果成員不存在則返回nil
zrank計算成員的排名【常用】
zrank是從分數從低到高返回排名
zrevrank反之
很明顯,排名從0開始計算。
zrem 刪除成員
允許一次刪除多個成員。
返回結果為成功刪除的個數。
zincrby 增加成員的分數
zrange和zrevrange返回指定排名范圍的成員【常用】
有序集合是按照分值排名的,zrange是從低到高返回,zrevrange反之。如果加上
withscores選項,同時會返回成員的分數
zrangebyscore返回指定分數范圍的成員
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores][limit offset count]
其中zrangebyscore按照分數從低到高返回,zrevrangebyscore反之。例如下面操作從低到高返回200到221分的成員,withscores選項會同時返回每個成員的分數。
同時min和max還支持開區間(小括號)和閉區間(中括號),-inf和+inf分別代表無限小和無限大:
zcount 返回指定分數范圍成員個數
zcount key min max
zremrangebyrank 按升序刪除指定排名內的元素
zremrangebyrank key start end
zremrangebyscore 刪除指定分數范圍的成員
zremrangebyscore key min max
實際案例
zset計算平均分:
當存在多個集合時候,需要計算不同集合同名元素的平均分時候,使用以下操作:
//取一個新集合,將zset1和zset2的值存到zsetavg中,權重比例是對半開
Zinterstore zsetavg 2 zset1 zset2 weights 0.5 0.5