前言介紹
很多小夥伴都跟我說,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來做一次並集示範。