Redis-技術專區-讓你徹底會使用“Redis中最陌生且最強大的集合”(ZSET)【前篇】

李浩宇Alex發表於2021-09-06

前言介紹

很多小夥伴都跟我說,redis中,ZSet(有序集合)是他們最陌生的集合,同時也是覺得特別複雜的集合之一,在開發過程中經常會用到它,而且也是大家最不太有把握使用的集合,所以筆者就從ZSet集合開始去講解Redis的集合的使用指南,希望可以幫助大家!

有序集合

ZSET(有序集合)的概念

有序集合(ZSET):是像集合(SET)一樣可以裝很多東西,只不過集合裝的是字串而有序集合(ZSET)裝的是鍵值對,從更嚴謹的角度講,有序集合和雜湊更接近只不過有序集合是有序的,有點像TreeSet

ZSET(有序集合)的定義

有序集合(ZSet):它是一個儲存著成員(member)本身物件值以及和它對應的分值(score)的鍵值對,並且按照分值從小到大自動排序。對應的具體的資料結構,

  • 有序集合的鍵被稱為成員(member)每個成員各不相同
  • 有序集合的值被稱為分值(score),分值必須是浮點數

ZADD命令:

  • 它的全稱叫做:zset add,將給定分值的成員新增到有序集合裡面

  • 因為有序集合是自排序的,所以也不像列表一樣有左插入或右插入

指令:
# zadd key score value
zadd zset-weight 60 Kelvin
java程式碼
System.out.println(conn.zadd("zset-weight",60,"Kelvin"));
作用

往zset-weight這個有序集合中新增Kelvin-60這個鍵值對

返回
  • “1” 存入成功
  • “0” 存入失敗,zset-weight已經存在該鍵值對
注意

有序集合的不一樣的地方就在於,將分值寫在前面,因為有序集合是要根據分值來進行排序的,預設從小到大(正序 ASC)

其他案例
zadd zset-weight 40 Lina
zadd zset-weight 50 Oscar
zadd zset-weight 70 Mike

執行完了儲存,我們接下來,如何刪除元素?

ZREM(移除)

ZREM全稱zset remove,從有序集合裡面移除給定的成員,並返回被移除成員的數量

指令
zrem zset-weight Mike
  • 作用:移除zset-weight中鍵為Mike的元素
  • 返回:"1" 表示移除元素數量為1
System.out.println(conn.zrem("zset-weight","Mike"));

ZCARD

ZCARD全稱zset card,返回有序集合包含的成員數量

指令
zcard high
java程式碼
System.out.println(conn.zadd("high",180,"Kelvin"));
System.out.println(conn.zadd("high",160,"Lina"));
System.out.println(conn.zadd("high",177,"Mike"));
System.out.println(conn.zcard("high"));

zcard命令返回3.


ZINCRBY

ZINCRBY全稱zset increase by,將成員的分值加上一個給定數。

System.out.println(conn.zincrby("high",2,"Kelvin"));

ZCOUNT

ZCOUNT全稱zset count,返回分值在[min,max]之間的成員數量

System.out.println(conn.zcount("high",165,190));

ZRANK

ZRANK全稱zset rank,返回成員在有序集合中的排名

System.out.println(conn.zrank("high","Kelvin"));

ZSCORE

ZSCORE全稱zset score,返回成員的分值

System.out.println(conn.zscore("high","Kelvin"));

ZRANGE(獲取)

  • ZRANGE全稱:zset range key start end [WITHSCORES] ,取出zset-weight中索引值在[start,end]之間的成員,即該範圍內的鍵值對,如果給定了可選WITHSCORES的選項,那麼命令會將成員的分值也一併返回。

  • 如果希望全部取出來,可以採用start=0,end=-1,可以看出來是一個環路,前開後閉。如果start選擇了1,就無法獲取第一個,拿出來的資料會少一個!而end=-1 則則說明獲取到最後一個

指令:
zrange key start end withscores
zrange zset-weight 0 -1 withscores
返回
  (1)"Lina"
  (2)"40"
  (3)"Oscar"
  (4)"50"
  (5)"Kelvin"
  (6)"60"
  (7)"Mike"
  (8)"70"

我們現在選擇選出排名第3到第6之間的資料,(3,6]

System.out.println(conn.zrange("high",3,6));

因為zrange的範圍是左開右閉,那麼如果我們想拿到(3,6]並且拿到這些的分值。

System.out.println(conn.zrangeWithScores("high",3,6));

ZRANGEBYSCORE

ZRANGEBYSCORE全稱zset range by score,它與zrange相比較區別在於根據分值範圍來獲取,返回有序集合中分值介於min和max之間的所有成員

需求場景

我們挑出分值在160到180之間的成員

指令
zrangebyscore key start end [withscores]
zrangebyscore zset-weight 160 180 withscores
java程式碼
System.out.println(conn.zrangeByScore("high",160,180));
作用

取出分值在[0,60]之間的鍵值對

返回
    (1)"Lina"
	(2)"40"
	(3)"Oscar"
	(4)"50"
	(5)"Kelvin"
	(6)"60"

ZREVRANGE

ZREVRANGE全稱zset reverse range,返回有序集合給定排名範圍內的成員,成員按照分值從大到小排列

指令
zrevrange key start end withscores
zrevrange zset-weight 0 -1 withscores
java程式碼
System.out.println(conn.zrevrange("high",1,5));

ZREVRANGEBYSCORE

ZREVRANGEBYSCORE全稱·zset reversal range by score,獲取有序集合中分值介於min和max之間的所有成員,並按照分值從大到小的順序來返回。

指令

倒序獲取160到180 的位置,注意此時 180 是開始座標 160是結束座標

zrevrangebyscore key start end 
zrevrangebyscore high 180 160
Java程式碼
System.out.println(conn.zrevrangeByScore("high",180,160));

ZREVRANK

ZREVRANK全稱zset reversal rank,返回成員在有序集合裡的排名,按照分值從大到小排列,預設的是從小到大,這裡翻轉了一下。

假設,“Kelvin”排第6,“Yellow”排第3,但是從逆向來看,“Kelvin”為0,“Yellow”為3,那麼我們寫行程式碼檢視一下。

System.out.println(conn.zrevrank("high","Yellow"));
System.out.println(conn.zrevrank("high","Kelvin"));

ZREMRANGEBYRANK

ZREMRANGEBYRANK全稱zset remove range by rank,移除有序集合中排名介於start和stop之間的所有成員

在移除之間先檢視一下redis中的資料

執行Java程式碼
System.out.println(conn.zremrangeByRank("high",2,4));

返回被移除的數量

ZREMRANGENYSCORE

ZREMRANGEBYSCORE全稱zset remove range by score移除有序集合中排名分值介於start和stop之間的所有成員

為了演示方便,我們將在high有序集合中多新增幾行資料

System.out.println(conn.zadd("high",174,"Jay"));
System.out.println(conn.zadd("high",169,"Pei"));
System.out.println(conn.zadd("high",186,"Jone"));

然後移除分值170以內的成員

System.out.println(conn.zremrangeByScore("high",0,170));

ZINTERSTORE

ZINTERSTORE全稱zset inter store,對給定的有序集合做交集運算,預設使用的聚合函式為sum,即預設在做交集操作時將不同集合中相同的成員所對應的分值相加,然後聚合成一個新的有序集合。

ZUNIONSTORE

ZUNIONSTORE全稱zset union store,對給定的有序集合做並集運算,同樣並集運算的聚合函式也可以選用“max”,"min"和“sum”。為了避免重複性說明,我們選用max來做一次並集示範。

相關文章