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


前言介紹

很多小伙伴都跟我說,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來做一次並集示范。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM