Redis實戰(zhàn)(7)-SortedSet之認識有序集合(命令行與代碼實戰(zhàn))

作者: 修羅debug
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。



摘要:緩存中間件Redis擁有許多豐富、重要且有趣的數(shù)據(jù)結(jié)構(gòu),前文介紹的字符串String、列表List和集合Set便是其中的佼佼者,本文以及后續(xù)篇章介紹的有序集合SortedSet和哈希Hash數(shù)據(jù)結(jié)構(gòu)亦是如此,毫不夸張的說,當(dāng)我們談及Redis的應(yīng)用場景時,這幾種數(shù)據(jù)結(jié)構(gòu)幾乎都會涉及。本文我們將以命令行和代碼的形式繼續(xù)認識一下Redis的有序集合SortedSet

內(nèi)容:在前面篇章中,我們給各位小伙伴介紹并實戰(zhàn)了緩存中間件Redis的集合Set,介紹了并實戰(zhàn)了其核心的幾個特性,包括“唯一性/不重復(fù)性”和“無序性”,其中還介紹了一種比較典型的應(yīng)用場景 ~ 利用集合Set實現(xiàn)“在線考試系統(tǒng)中考生如何獲取隨機、唯一且每份試卷的題目是亂序不一樣的試題列表”。

而從本文開始,我們將給大家介紹 集合Set 的“孿生兄弟”,即有序集合SortedSet,這種數(shù)據(jù)結(jié)構(gòu)延伸了集合Set的“元素唯一/不重復(fù)”的特性,但卻有一點不同于集合Set,那就是SortedSet的成員元素具有“有序性”,而其“有序性”的實現(xiàn)是通過“添加成員時附帶一個double類型的參數(shù):分數(shù)”,從某種程度上講,集合Set 和 有序集合SortedSet 可以說是一對“雙胞胎”!

正是由于有序集合SortedSet的這兩大特性,使得它本身也具有相當(dāng)廣泛的應(yīng)用場景,比如“排行榜”便是其中相當(dāng)常見的一種業(yè)務(wù)場景,我們將在后面的篇章中給各位小伙伴介紹如何利用有序集合SortedSet + 實際的代碼實戰(zhàn)“游戲充值排行榜”的實現(xiàn)!

本文我們將首先以命令行 + 代碼的方式來認識并實戰(zhàn)SortedSet,當(dāng)作是對人家的一種認識吧!

對于有序集合SortedSet的常見命令,debug在這里給各位小伙伴貼了一張總覽圖,如下圖所示,可以說是包含了SortedSet常見的諸多操作了:


下面我們再重點挑出幾個使用相當(dāng)頻繁的命令吧!

(1)往集合添加N個成員,其中每個成員需要帶上一個double類型的參數(shù):分數(shù)

ZADD manScores 10 jack 11 debug 12 michael 13 mary 15 maria 20 xiuluo

返回值:(integer) 6

(2)返回集合當(dāng)中成員的分數(shù)值:  

ZSCORE  manScores  jack

返回值:"10"

(3)獲取集合中的成員總數(shù):  

ZCARD manScores

返回值:(integer) 6

(4)為集合中指定的成員加上增量分數(shù):  

ZINCRBY manScores 10 jack

返回值:"20"

(5)通過分數(shù)返回集合中指定區(qū)間內(nèi)的成員:  

ZRANGEBYSCORE manScores 15 20 WITHSCORES

返回值:
1) "maria"
2) "15"
3) "jack"
4) "20"
5) "xiuluo"
6) "20"

(6)按照分數(shù)從低到高的排序-返回集合對應(yīng)的所有成員:  

ZRANGE manScores 0 10 WITHSCORES

返回值:
1) "debug"
2) "11"
3) "michael"
4) "12"
5) "maria"
6) "15"
7) "jack"
8) "20"
9) "xiuluo"
10) "20"

(從高到低的排序:ZREVRANGE)

(7)返回集合中指定成員的排名(從低到高排名-排名從0開始):

ZRANK manScores maria

返回值:(integer) 2

(從高到低的排名:ZREVRANK)

(8)返回集合中指定分數(shù)區(qū)間內(nèi)的成員-分數(shù)從高到低排序:

ZREVRANGEBYSCORE manScores 20 20

返回值:
1) "xiuluo"
2) "jack"

其余命令的實操各位小伙伴就自個兒去擼一擼了,只需要打開redis-cli.exe即可愉快的操作了!

最后,我們基于前文介紹的Spring Boot2.0搭建的項目寫個Junit,即Java 單元測試方法,以實際代碼的形式介紹并實戰(zhàn)有序集合SortedSet相關(guān)命令所對應(yīng)的的實際代碼,如下所示:

    @Test
public void method4() {
log.info("----開始有序集合SortedSet測試");

final String key = "SpringBootRedis:SortedSet:10010";
redisTemplate.delete(key);

ZSetOperations<String,String> zSetOperations=redisTemplate.opsForZSet();
zSetOperations.add(key,"a",8.0);
zSetOperations.add(key,"b",2.0);
zSetOperations.add(key,"c",4.0);
zSetOperations.add(key,"d",6.0);

log.info("---有序集合SortedSet-成員數(shù):{}",zSetOperations.size(key));
log.info("---有序集合SortedSet-按照分數(shù)正序:{}",zSetOperations.range(key,0L,zSetOperations.size(key)));
log.info("---有序集合SortedSet-按照分數(shù)倒序:{}",zSetOperations.reverseRange(key,0L,zSetOperations.size(key)));

log.info("---有序集合SortedSet-獲取成員a的得分:{}",zSetOperations.score(key,"a"));
log.info("---有序集合SortedSet-獲取成員c的得分:{}",zSetOperations.score(key,"c"));

log.info("---有序集合SortedSet-正序中c的排名:{} 名",zSetOperations.rank(key,"c")+1);
log.info("---有序集合SortedSet-倒序中c的排名:{} 名",zSetOperations.reverseRank(key,"c"));

zSetOperations.incrementScore(key,"b",10.0);
log.info("---有序集合SortedSet-按照分數(shù)倒序:{}",zSetOperations.reverseRange(key,0L,zSetOperations.size(key)));

zSetOperations.remove(key,"b");
log.info("---有序集合SortedSet-按照分數(shù)倒序:{}",zSetOperations.reverseRange(key,0L,zSetOperations.size(key)));

log.info("---有序集合SortedSet-取出分數(shù)區(qū)間的成員:{}",zSetOperations.rangeByScore(key,0,7));

log.info("---有序集合SortedSet-取出帶分數(shù)的排好序的成員:");
Set<ZSetOperations.TypedTuple<String>> set=zSetOperations.rangeWithScores(key,0L,zSetOperations.size(key));
set.forEach(tuple -> log.info("--當(dāng)前成員:{} 對應(yīng)的分數(shù):{}",tuple.getValue(),tuple.getScore()));

}

相關(guān)的方法以及API就不多做介紹了,在上面的日志log.info()里已經(jīng)介紹得相當(dāng)詳細了!點擊運行該單元測試方法,可以得到如下圖的結(jié)果:


值得一提的是,建議各位小伙伴一定要將實際的代碼操作 與 對應(yīng)Dos下的命令行對應(yīng)起來,只有這樣子才能更徹底的理解并應(yīng)用SortedSet.

好了,本篇文章我們就介紹到這里了,建議各位小伙伴一定要照著文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了“空談?wù)摺保?/span>

對Redis相關(guān)技術(shù)棧以及實際應(yīng)用場景實戰(zhàn)感興趣的小伙伴可以前往Debug搭建的技術(shù)社區(qū)的課程中心進行學(xué)習(xí)觀看:https://www.fightjava.com/web/index/course/detail/12 !

其他相關(guān)的技術(shù),感興趣的小伙伴可以關(guān)注底部Debug的技術(shù)公眾號,或者加Debug的微信,拉你進“微信版”的真正技術(shù)交流群!一起學(xué)習(xí)、共同成長!

補充:

1、本文涉及到的相關(guān)的源代碼可以到此地址,check出來進行查看學(xué)習(xí):

https://gitee.com/steadyjack/SpringBootRedis

2、目前Debug已將本文所涉及的內(nèi)容整理錄制成視頻教程,感興趣的小伙伴可以前往觀看學(xué)習(xí):https://www.fightjava.com/web/index/course/detail/12

3、關(guān)注一下Debug的技術(shù)微信公眾號,最新的技術(shù)文章、課程以及技術(shù)專欄將會第一時間在公眾號發(fā)布哦!