redis 簡單整理——redis 的有序集合基本結構和命令[六]

敖毛毛 2021-08-15 18:16:21 阅读数:652

本文一共[544]字,预计阅读时长:1分钟~
redis 整理 redis 有序 集合

前言

簡單介紹一下redis的有序集合的基本結構和命令。

正文

有序集合相對於哈希、列錶、集合來說會有一點點陌生,但既然叫有序 集合,那麼它和集合必然有著聯系,它保留了集合不能有重複成員的特性, 但不同的是,有序集合中的元素可以排序。

但是它和列錶使用索引下標作為 排序依據不同的是,它給每個元素設置一個分數(score)作為排序的依 據。

有序集合包含kris、mike、frank、tim、martin、tom, 它們的分數分別是1、91、200、220、250、251,有序集合提供了獲取指定 分數和元素範圍查詢、計算成員排名等功能,合理的利用有序集合,能幫助 我們在實際開發中解决很多問題。

注意:

有序集合中的元素不能重複,但是score可以重複,就和一個班裏的同學學號不能重複,但是考試成績可以相同。

那麼下面就來介紹其中的命令吧。

zadd key score member [score member ...]

注意點:

·Redis3.2為zadd命令添加了nx、xx、ch、incr四個選項:
·nx:member必須不存在,才可以設置成功,用於添加。
·xx:member必須存在,才可以設置成功,用於更新。
·ch:返回此次操作後,有序集合元素和分數發生變化的個數
·incr:對score做增加,相當於後面介紹的zincrby

性能:

有序集合相比集合提供了排序字段,但是也產生了代價,zadd的時間 複雜度為O(log(n)),sadd的時間複雜度為O(1)。

zcard key 計算成員個數:

zscore 獲取某個成員的權重:

如果不存在返回為空:

zrank 錶示從低到高排序,從0開始的:

zrevrank 錶示從高到底排序,從0開始的:

zrem key member 删除某個成員:

給某個值增加權重:

返回指定排名的成員:

如果加上withscores 還會返回分數:

zrevrange 自然就是從高到底排序,然後取出部分。

zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]

上面返回指定分數範圍。

返回指定範圍個數:

zcount key min max

删除指定排名內的昇序元素:

zremrangebyrank key start end

删除指定分數範圍的成員:

zremrangebyscore key min max

下面就是集合範圍相關的東西了:
交集

zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
這個命令參數較多,下面分別進行說明: ·destination:交集計算結果保存到這個鍵。
·numkeys:需要做交集計算鍵的個數。 ·key[key...]:需要做交集計算的鍵。139
·weights weight[weight...]:每個鍵的權重,在做交集計算時,每個鍵中 的每個member會將自己分數乘以這個權重,每個鍵的權重默認是1
。 ·aggregate sum|min|max:計算成員交集後,分值可以按照sum(和)、 min(最小值)、max(最大值)做匯總,默認值是sum。

並集:

zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]

複雜度:

內部編碼

·ziplist(壓縮列錶):當有序集合的元素個數小於zset-max-ziplist- entries配置(默認128個),同時每個元素的值都小於zset-max-ziplist-value配 置(默認64字節)時,Redis會用ziplist來作為有序集合的內部實現,ziplist 可以有效减少內存的使用。
·skiplist(跳躍錶):當ziplist條件不滿足時,有序集合會使用skiplist作 為內部實現,因為此時ziplist的讀寫效率會下降。

使用場景

有序集合比較典型的使用場景就是排行榜系統。

下面用點贊數排行作為例子:

1.例如用戶mike上傳了一個視頻,並獲得了3個贊,可以使用有序集合的 zadd和zincrby功能

zadd user:ranking:2016_03_15 mike 3

如果之後再獲得一個贊,可以使用zincrby:

zincrby user:ranking:2016_03_15 mike 1

2.由於各種原因(例如用戶注銷、用戶作弊)需要將用戶删除,此時需要 將用戶從榜單中删除掉,可以使用zrem。例如删除成員tom:

zrem user:ranking:2016_03_15 mike

3.展示獲取贊數最多的十個用戶 此功能使用zrevrange命令實現:

zrevrangebyrank user:ranking:2016_03_15 0 9
  1. 此功能將用戶名作為鍵後綴,將用戶信息保存在哈希類型中,至於用戶 的分數和排名可以使用zscore和zrank兩個功能:
hgetall user:info:mike
zscore user:ranking:2016_03_15 mike
zrank user:ranking:2016_03_15 mike

下一節,鍵管理。

版权声明:本文为[敖毛毛]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815181603022z.html