Redis 資料型別 Zset

2021-10-14 06:09:39 字數 3376 閱讀 2388

redis 常用命令,思維導圖 >>>

zsetredis提供的乙個非常特別的資料結構,常用作排行榜等功能,以使用者idvalue,關注時間或者分數作為score進行排序。與其他資料結構相似,zset也有兩種不同的實現,分別是ziplistskiplist

zset 儲存示意圖:每個 value 後面都攜帶乙個分數,然後用作排序

跳表(skip list)是一種隨機化的資料結構,基於併聯的鍊錶,實現簡單,插入、刪除、查詢的複雜度均為o(logn)。簡單說來跳表也是鍊錶的一種,只不過它在鍊錶的基礎上增加了跳躍功能,正是這個跳躍的功能,使得在查詢元素時,跳表能夠提供o(logn)的時間複雜度。

看乙個有序鍊錶,如下圖(最左側的灰色節點表示乙個空的頭結點):

在這樣乙個鍊錶中,如果我們要查詢某個資料,那麼需要從頭開始逐個進行比較,直到找到包含資料的那個節點,或者找到第乙個比給定資料大的節點為止(沒找到)。也就是說,時間複雜度為o(n)。同樣,當我們要插入新資料的時候,也要經歷同樣的查詢過程,從而確定插入位置。

假如我們每相鄰兩個節點增加乙個指標,讓指標指向下下個節點,如下圖:

這樣所有新增加的指標連成了乙個新的鍊錶,但它包含的節點個數只有原來的一半。現在當我們想查詢資料的時候,可以先沿著這個新鍊錶進行查詢。當碰到比待查資料大的節點時,再回到原來的鍊錶中進行查詢。比如,我們想查詢23,查詢的路徑是沿著下圖中標紅的指標所指向的方向進行的:

資料結果

是否允許重複元素

是否有序

有序實現方式

應用場景

列表 list是是

索引下標

時間軸、訊息佇列

集合 set否否

無標籤、社交

有序集合 zset否是

分值排行榜,社交

redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員

不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

使用場景:

1、根據時間排序的新聞列表等,

2、閱讀排行榜

--- 建立或設定指定key對應的有序集合,根據每個值對應的score來排名,公升序。例如有命令 zadd key1 10 a 20 b 30 d 40 c;那麼真實排名是 a b d c

zrem key member

--- 刪除指定key對應的集合中的member元素

zcard key

--- 返回指定key對應的有序集合的元素數量

zincrby key increment member

--- 將指定key對應的集合中的member元素對應的分值遞增加 increment

zcount key min max

--- 返回指定key對應的有序集合中,分值在min~max之間的元素個數

zrank key member

--- 返回指定key對應的有序集合中,指定元素member在集合中排名,從0開始切分值是從小到大公升序

zscore key member

--- 返回指定key中的集合中指定member元素對應的分值

zrange key min max [withscores]

--- 返回指定key對應的有序集合中,索引在min~max之間的元素資訊,如果帶上 withscores 屬性的話,可以將分值也帶出來

zrevrank key member

--- 返回指定key對應的集合中,指定member在其中的排名,注意排名從0開始且按照分值從大到小降序

zrevrange key start end [withscores]

--- 指定key對應的集合中,分值在 start~end之間的降序,加上 withscores 的話可以將分值以及value都顯示出來

zrangebyscore key start end [withscores]

--- 同 zrange命令不同的是,zrange命令是索引在startend範圍的查詢,而zrangebyscore命令是根據分值在startend之間的查詢且公升序展示

zrevrangebyscore key max min [withscores]

--- 同zrangebyscore命令不同的是,zrangebyscores是根據分值從小到大公升序展示,而zrevrangebyscore命令是從max到min降序展示

zremrangebyrank key start end

--- 移除指定key對應集合中索引在start~end之間(包括start和end本身)的元素

zremrangebyscore by min max

--- 同zremrangebyrank命令類似,不同的該命令是刪除分值在min~max之間的元素

zinterstore desk-key key-count key...

--- 獲取指定數量的key的交集。例如有 key1:,key2,那麼命令 zinterstore key3 2 key1 key2 意思就是 將key1 key2這兩個集合的交集 賦給key3,如何獲取key1與key2的交集呢。 key1中存在 a b c,key2中存在 b c d,那麼交集就是 b 和 c,且 b與c對應的score也會疊加,即 key3

zunionstore desk-key key-count key...

--- 獲取指定數量key的並集,例如有 key1,key2,可以看出 a和d不是key1與key2共有的,但是並集中只要存在就會記錄進去,然後b與c是共有的,即 並集的結果就是 key3

Redis資料型別 ZSET

1 zset為有序集合,其餘set非常類似,但是不同的是有序集合的每個成員都會關聯乙個評分,zest則通過這個評分的大小為集合中的成員進行排序 由低到高 集合的元素是唯一 的,但是評分卻可以重複。2 有序集合 支援新增 刪除 更新元素。由於有序性,可以很快根據評分獲取乙個範圍的元素。在有序集合中,你...

redis資料型別之ZSet

1 設定和獲取127.0 0.1 6379 zadd zset1 10 a zadd key score key integer 1127.0 0.1 6379 zadd zset1 50 b integer 1127.0 0.1 6379 zadd zset1 30 c integer 1127....

Redis資料型別之ZSet型別

有序集合 sorted set 1 redis 有序集合和集合一樣,也是string型別元素的集合,且不允許有重複的成員。2 不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。3 有序集合的成員是唯一的,但分數 score 卻可以重複。4 ...