Zset
- ZADD
- ZCARD
- ZCOUNT
- ZRANGE/ZREVRANGE
- ZRANGEBYSCORE
- ZPOPMAX/ZPOPMIN
- BZPOPMAX/BZPOPMIN
- ZRANK/ZREVRANK
- ZSCORE
- ZREM
- ZREMRANGEBYRANK
- ZREMRANGEBYSCORE
- ZINCRBY
- ZINTERSTORE/ZUNIONSTORE
- 內部編碼
- 使?場景
ZADD
添加或者更新指定的元素以及關聯的分數到 zset 中,分數應該符合 double 類型,+inf/-inf 作為正負極限也是合法的
ZADD 的相關選項:
- XX:僅僅?于更新已經存在的元素,不會添加新元素。
- NX:僅?于添加新元素,不會更新已經存在的元素。
- CH:默認情況下,ZADD 返回的是本次添加的元素個數,但指定這個選項之后,就會還包含本次更新的元素的個數。
- INCR:此時命令類似 ZINCRBY 的效果,將元素的分數加上指定的分數。此時只能指定?個元素和分數。
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
時間復雜度:O(log(N))
ZCARD
獲取?個 zset 的基數(cardinality),即 zset 中的元素個數
ZCARD key
時間復雜度:O(1)
ZCOUNT
返回分數在 min 和 max 之間的元素個數,默認情況下,min 和 max 都是包含的
ZCOUNT key min max
時間復雜度:O(log(N))
ZRANGE/ZREVRANGE
返回指定區間?的元素,分數按照升序 / 降序。帶上 WITHSCORES 可以把分數也返回
ZRANGE(ZREVRANGE) key start stop [WITHSCORES]
時間復雜度:O(log(N)+M)
ZRANGEBYSCORE
返回分數在 min 和 max 之間的元素,默認情況下,min 和 max 都是包含的
ZRANGEBYSCORE key min max [WITHSCORES]
時間復雜度:O(log(N)+M)
ZPOPMAX/ZPOPMIN
刪除并返回分數最? / 最低的 count 個元素
ZPOPMAX(ZPOPMIN) key [count]
時間復雜度:O(log(N) * M)
BZPOPMAX/BZPOPMIN
ZPOPMAX / ZPOPMIN的阻塞版本
BZPOPMAX(BZPOPMIN) key [key ...] timeout
時間復雜度:O(log(N))
ZRANK/ZREVRANK
返回指定元素的排名,升序 / 降序
ZRANK(ZREVRANK) key member
時間復雜度:O(log(N))
ZSCORE
返回指定元素的分數
ZSCORE key member
時間復雜度:O(1)
ZREM
刪除指定的元素
ZREM key member [member ...]
時間復雜度:O(M*log(N))
ZREMRANGEBYRANK
按照排序,升序刪除指定范圍的元素,左閉右閉(下標)
ZREMRANGEBYRANK key start stop
時間復雜度:O(log(N)+M)
ZREMRANGEBYSCORE
按照分數刪除指定范圍的元素,左閉右閉
ZREMRANGEBYSCORE key min max
時間復雜度:O(log(N)+M)
ZINCRBY
為指定的元素的關聯分數添加指定的分數值
ZINCRBY key increment member
時間復雜度:O(log(N))
ZINTERSTORE/ZUNIONSTORE
求出給定有序集合中元素的交集 / 并集并保存進?標有序集合中,在合并過程中以元素為單位進?合并,元素對應的分數按照不同的聚合?式和權重得到新的分數
ZINTERSTORE(ZUNIONSTORE) destination numkeys key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE <SUM | MIN | MAX>]
時間復雜度:O(NK)+O(Mlog(M)) N 是輸?的有序集合中, 最?的有序集合的元素個數; K 是輸?了 ?個有序集合; M 是最終結果的有序集合的元素個數.
內部編碼
有序集合類型的內部編碼有兩種:
- ziplist(壓縮列表):當有序集合的元素個數?于 zset-max-ziplist-entries 配置(默認 128 個), 同時每個元素的值都?于 zset-max-ziplist-value 配置(默認 64 字節)時,Redis 會? ziplist 來作 為有序集合的內部實現,ziplist 可以有效減少內存的使?。
- skiplist(跳表):當 ziplist 條件不滿?時,有序集合會使? skiplist 作為內部實現,因為此時 ziplist 的操作效率會下降。
使?場景
有序集合?較典型的使?場景就是排?榜系統。例如常?的?站上的熱榜信息,榜單的維度可能是多??的:按照時間、按照閱讀量、按照點贊量。本例中我們使?點贊數這個維度,維護每天的熱榜