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

概述:本系列博文所涉及的相關內容來源於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章