Redis實(shí)現(xiàn)排名功能的示例代碼
前言
之前在消費(fèi)金融平臺(tái)的時(shí)候,公司有一個(gè)專(zhuān)門(mén)給線下銷(xiāo)售人員使用的APP,APP記錄銷(xiāo)售推廣公司貸款產(chǎn)品賺取的傭金以及一些門(mén)店開(kāi)拓和打卡的功能,后端是由我和另外一個(gè)同事開(kāi)發(fā)的,其中有一個(gè)模塊是全國(guó)門(mén)店內(nèi)的銷(xiāo)售傭金實(shí)時(shí)排名,說(shuō)到排名很多人的第一反應(yīng)都是這是個(gè)Top N的問(wèn)題,從數(shù)據(jù)庫(kù)取出來(lái)用MySQL的top函數(shù)不就可以實(shí)現(xiàn)了,事實(shí)上當(dāng)時(shí)無(wú)法從表里取到數(shù)據(jù),數(shù)據(jù)還要配合權(quán)限,有全國(guó)和大區(qū)的排名,還需要計(jì)算大區(qū)經(jīng)理下所有人員的有效傭金,還要求是實(shí)時(shí)的,從數(shù)據(jù)庫(kù)讀取再計(jì)算肯定不行,跳到排名頁(yè)至少等待5s左右數(shù)據(jù)才能出來(lái),那怎么辦呢,可以放Redis里,那么接下來(lái)我們一起看看如何用Redis實(shí)現(xiàn)這個(gè)排名功能。
一.實(shí)現(xiàn)思路
使用的是Redis里zset數(shù)據(jù)類(lèi)型,zset的定義這里總結(jié)一下就是其每個(gè)元素都能夠關(guān)聯(lián)一個(gè)分?jǐn)?shù)而且還能夠針對(duì)集合元素進(jìn)行排序,所以這點(diǎn)很合適用來(lái)排序,接下來(lái)我們一起看看如何用其實(shí)現(xiàn)排名功能。
二.具體實(shí)現(xiàn)
1.添加數(shù)據(jù)的方法包裝
public ?void zAdd(String key,Object member,double score){
? ? try {
? ? ? ? ? redisTemplate.opsForZSet().add(key,member,score);
? ? } catch (Exception e) {
? ? ? ? log.error("redis zAdd has a error,key:{},value:{},score:{},exception:{}",key,member,score,e);
? ? }
}2.獲取數(shù)據(jù)的方法包裝
public ?Set<Object> zRange(String key,int start,int end){
? ? try {
? ? //按照位置倒序取值和分?jǐn)?shù)
? ? ? ? Set<ZSetOperations.TypedTuple<Object>> typedTuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);
? ? ? ? if(typedTuples==null||typedTuples.size()==0) return null;
? ? ? ? return Collections.singleton(typedTuples);
? ? } catch (Exception e) {
? ? ? ? log.error("redis zRange has a error,key:{},start:{},end:{},exception:{}",
? ? ? ? ? ? ? ? key,start,end,e);
? ? ? ? return null;
? ? }
}3.測(cè)試方法,亂序添加,如果想傭金從少到多在傭金前添加負(fù)號(hào)即可
redisUtils.zAdd("rank","王五",new Double("2000.00"));
redisUtils.zAdd("rank","張三",new Double("1000.00"));
redisUtils.zAdd("rank","王可",new Double("4000.00"));
redisUtils.zAdd("rank","向巧巧",new Double("6000.00"));
redisUtils.zAdd("rank","沙振華",new Double("7000.00"));
redisUtils.zAdd("rank","錢(qián)多多",new Double("5000.00"));
redisUtils.zAdd("rank","黃三",new Double("3000.00"));
redisUtils.zAdd("rank","高邱",new Double("8000.00"));
redisUtils.zAdd("rank","許晴",new Double("9000.00"));
redisUtils.zAdd("rank","包虎",new Double("10000.00"));
//獲取添加進(jìn)redis的數(shù)據(jù),使用上面2方法
Set<Object> rank = redisUtils.zRange("rank", 0, 9);
//todo 拿到數(shù)據(jù)進(jìn)行其他邏輯處理
//打印結(jié)果
rank.forEach(System.out::println);4.執(zhí)行結(jié)果
[DefaultTypedTuple [score=10000.0, value=包虎],
DefaultTypedTuple [score=9000.0, value=許晴],
DefaultTypedTuple [score=8000.0, value=高邱],
DefaultTypedTuple [score=7000.0, value=沙振華],
DefaultTypedTuple [score=6000.0, value=向巧巧],
DefaultTypedTuple [score=5000.0, value=錢(qián)多多],
DefaultTypedTuple [score=4000.0, value=王可],
DefaultTypedTuple [score=3000.0, value=黃三],
DefaultTypedTuple [score=2000.0, value=王五],
DefaultTypedTuple [score=1000.0, value=張三]]
小結(jié)
zset里除了計(jì)算排名的方法還有計(jì)算集合條件內(nèi)個(gè)數(shù)的zcount方法,查看集合總個(gè)數(shù)zcard方法等等,用起來(lái)還是很方便的,但是還是那句話具體的只能到具體的業(yè)務(wù)里才知道實(shí)用不,而且還要注意Redis有數(shù)據(jù)淘汰策略,這個(gè)點(diǎn)也千萬(wàn)不要忽視了,還有就是針對(duì)已經(jīng)廢棄的業(yè)務(wù)數(shù)據(jù)還在緩存在Redis的里也要記得檢查和清除掉。
到此這篇關(guān)于Redis實(shí)現(xiàn)排名功能的示例代碼的文章就介紹到這了,更多相關(guān)Redis 排名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
 Redis監(jiān)控工具RedisInsight安裝與使用
這篇文章主要為大家介紹了Redis監(jiān)控工具RedisInsight的安裝步驟與使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
 springboot使用Redis作緩存使用入門(mén)教程
這篇文章主要介紹了springboot使用Redis作緩存使用入門(mén)教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
 緩存穿透是指當(dāng)用戶在查詢(xún)一條數(shù)據(jù)的時(shí)候,而此時(shí)數(shù)據(jù)庫(kù)和緩存卻沒(méi)有關(guān)于這條數(shù)據(jù)的任何記錄,而這條數(shù)據(jù)在緩存中沒(méi)找到就會(huì)向數(shù)據(jù)庫(kù)請(qǐng)求獲取數(shù)據(jù)。用戶拿不到數(shù)據(jù)時(shí),就會(huì)一直發(fā)請(qǐng)求,查詢(xún)數(shù)據(jù)庫(kù),這樣會(huì)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)造成很大的壓力2022-07-07
 Redis簡(jiǎn)單動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)示例
Redis沒(méi)有直接復(fù)用C語(yǔ)言的字符串,而是新建了SDS,本文主要介紹了Redis簡(jiǎn)單動(dòng)態(tài)字符串SDS的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
 Redis list 類(lèi)型學(xué)習(xí)筆記與總結(jié)
這篇文章主要介紹了Redis list 類(lèi)型學(xué)習(xí)筆記與總結(jié),本文著重講解了關(guān)于List的一些常用方法,比如lpush 方法、lrange 方法、rpush 方法、linsert 方法、 lset 方法等,需要的朋友可以參考下2015-06-06
 Redis String 類(lèi)型和 Hash 類(lèi)型學(xué)習(xí)筆記與總結(jié)
這篇文章主要介紹了Redis String 類(lèi)型和 Hash 類(lèi)型學(xué)習(xí)筆記與總結(jié),本文分別對(duì)String 類(lèi)型的一些方法和Hash 類(lèi)型做了詳細(xì)介紹,需要的朋友可以參考下2015-06-06
 利用Redis進(jìn)行數(shù)據(jù)緩存的項(xiàng)目實(shí)踐
在實(shí)際的業(yè)務(wù)場(chǎng)景中,Redis 一般和其他數(shù)據(jù)庫(kù)搭配使用,用來(lái)減輕后端數(shù)據(jù)庫(kù)的壓力,本文就介紹了利用Redis進(jìn)行數(shù)據(jù)緩存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2022-06-06

