概述:本系列博文所涉及的相關內容來源於debug親自錄製的實戰課程:緩存中間件Redis技術入門與應用場景實戰(SpringBoot2.x + 搶紅包系統設計與實戰),感興趣的小夥伴可以點擊自行前往學習(畢竟以視頻的形式來掌握技術 會更快!) ,文章所屬專欄:緩存中間件Redis技術入門與實戰
摘要:緩存中間件Redis擁有許多豐富、重要且有趣的數據結構,前文介紹的字符串String、列表List和集合Set便是其中的佼佼者,本文以及後續篇章介紹的有序集合SortedSet和哈希Hash數據結構亦是如此,毫不誇張的說,當我們談及Redis的應用場景時,這幾種數據結構幾乎都會涉及。本文我們將以命令行和代碼的形式繼續認識一下Redis的有序集合SortedSet
內容:在前面篇章中,我們給各位小夥伴介紹並實戰了緩存中間件Redis的集合Set,介紹了並實戰了其核心的幾個特性,包括“唯一性/不重複性”和“無序性”,其中還介紹了一種比較典型的應用場景 ~ 利用集合Set實現“在線考試系統中考生如何獲取隨機、唯一且每份試卷的題目是亂序不一樣的試題列表”。
而從本文開始,我們將給大家介紹 集合Set 的“孿生兄弟”,即有序集合SortedSet,這種數據結構延伸了集合Set的“元素唯一/不重複”的特性,但卻有一點不同於集合Set,那就是SortedSet的成員元素具有“有序性”,而其“有序性”的實現是通過“添加成員時附帶一個double類型的參數:分數”,從某種程度上講,集合Set 和 有序集合SortedSet 可以說是一對“雙胞胎”!
正是由於有序集合SortedSet的這兩大特性,使得它本身也具有相當廣泛的應用場景,比如“排行榜”便是其中相當常見的一種業務場景,我們將在後面的篇章中給各位小夥伴介紹如何利用有序集合SortedSet + 實際的代碼實戰“遊戲充值排行榜”的實現!
本文我們將首先以命令行 + 代碼的方式來認識並實戰SortedSet,當作是對人家的一種認識吧!
對於有序集合SortedSet的常見命令,debug在這裏給各位小夥伴貼了一張總覽圖,如下圖所示,可以說是包含了SortedSet常見的諸多操作了:
下面我們再重點挑出幾個使用相當頻繁的命令吧!
(1)往集合添加N個成員,其中每個成員需要帶上一個double類型的參數:分數
ZADD manScores 10 jack 11 debug 12 michael 13 mary 15 maria 20 xiuluo 返回值:(integer) 6
(2)返回集合當中成員的分數值:
ZSCORE manScores jack 返回值:"10"
(3)獲取集合中的成員總數:
ZCARD manScores 返回值:(integer) 6
(4)爲集合中指定的成員加上增量分數:
ZINCRBY manScores 10 jack 返回值:"20"
(5)通過分數返回集合中指定區間內的成員:
ZRANGEBYSCORE manScores 15 20 WITHSCORES 返回值:1) "maria"2) "15"3) "jack"4) "20"5) "xiuluo"6) "20"
(6)按照分數從低到高的排序-返回集合對應的所有成員:
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)返回集合中指定分數區間內的成員-分數從高到低排序:
ZREVRANGEBYSCORE manScores 20 20返回值:1) "xiuluo"2) "jack"
其餘命令的實操各位小夥伴就自個兒去擼一擼了,只需要打開redis-cli.exe即可愉快的操作了!
最後,我們基於前文介紹的Spring Boot2.0搭建的項目寫個Junit,即Java 單元測試方法,以實際代碼的形式介紹並實戰有序集合SortedSet相關命令所對應的的實際代碼,如下所示:
@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-成員數:{}",zSetOperations.size(key)); log.info("---有序集合SortedSet-按照分數正序:{}",zSetOperations.range(key,0L,zSetOperations.size(key))); log.info("---有序集合SortedSet-按照分數倒序:{}",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-按照分數倒序:{}",zSetOperations.reverseRange(key,0L,zSetOperations.size(key))); zSetOperations.remove(key,"b"); log.info("---有序集合SortedSet-按照分數倒序:{}",zSetOperations.reverseRange(key,0L,zSetOperations.size(key))); log.info("---有序集合SortedSet-取出分數區間的成員:{}",zSetOperations.rangeByScore(key,0,7)); log.info("---有序集合SortedSet-取出帶分數的排好序的成員:"); Set<ZSetOperations.TypedTuple<String>> set=zSetOperations.rangeWithScores(key,0L,zSetOperations.size(key)); set.forEach(tuple -> log.info("--當前成員:{} 對應的分數:{}",tuple.getValue(),tuple.getScore())); }
相關的方法以及API就不多做介紹了,在上面的日誌log.info()裏已經介紹得相當詳細了!點擊運行該單元測試方法,可以得到如下圖的結果:
值得一提的是,建議各位小夥伴一定要將實際的代碼操作 與 對應Dos下的命令行對應起來,只有這樣子才能更徹底的理解並應用SortedSet.
好了,本篇文章我們就介紹到這裏了,建議各位小夥伴一定要照着文章提供的樣例代碼擼一擼,只有擼過才能知道這玩意是咋用的,否則就成了“空談者”!對Redis相關技術棧以及實際應用場景實戰感興趣的小夥伴可以咱們51cto學院 debug親自錄製的課程進行學習:緩存中間件Redis技術入門與應用場景實戰(SpringBoot2.x + 搶紅包系統設計與實戰)
補充:
1、本文涉及到的相關的源代碼可以到此地址,check出來進行查看學習:https://gitee.com/steadyjack/SpringBootRedis
2、目前debug已將本文所涉及的內容整理錄製成視頻教程,感興趣的小夥伴可以前往觀看學習:https://edu.51cto.com/course/20384.html