Redis實現(xiàn)排名功能的示例代碼
前言
之前在消費金融平臺的時候,公司有一個專門給線下銷售人員使用的APP,APP記錄銷售推廣公司貸款產品賺取的傭金以及一些門店開拓和打卡的功能,后端是由我和另外一個同事開發(fā)的,其中有一個模塊是全國門店內的銷售傭金實時排名,說到排名很多人的第一反應都是這是個Top N的問題,從數(shù)據(jù)庫取出來用MySQL的top函數(shù)不就可以實現(xiàn)了,事實上當時無法從表里取到數(shù)據(jù),數(shù)據(jù)還要配合權限,有全國和大區(qū)的排名,還需要計算大區(qū)經理下所有人員的有效傭金,還要求是實時的,從數(shù)據(jù)庫讀取再計算肯定不行,跳到排名頁至少等待5s左右數(shù)據(jù)才能出來,那怎么辦呢,可以放Redis里,那么接下來我們一起看看如何用Redis實現(xiàn)這個排名功能。
一.實現(xiàn)思路
使用的是Redis里zset數(shù)據(jù)類型,zset的定義這里總結一下就是其每個元素都能夠關聯(lián)一個分數(shù)而且還能夠針對集合元素進行排序,所以這點很合適用來排序,接下來我們一起看看如何用其實現(xiàn)排名功能。
二.具體實現(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 {
? ? //按照位置倒序取值和分數(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.測試方法,亂序添加,如果想傭金從少到多在傭金前添加負號即可
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","錢多多",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"));
//獲取添加進redis的數(shù)據(jù),使用上面2方法
Set<Object> rank = redisUtils.zRange("rank", 0, 9);
//todo 拿到數(shù)據(jù)進行其他邏輯處理
//打印結果
rank.forEach(System.out::println);4.執(zhí)行結果
[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=錢多多],
DefaultTypedTuple [score=4000.0, value=王可],
DefaultTypedTuple [score=3000.0, value=黃三],
DefaultTypedTuple [score=2000.0, value=王五],
DefaultTypedTuple [score=1000.0, value=張三]]
小結
zset里除了計算排名的方法還有計算集合條件內個數(shù)的zcount方法,查看集合總個數(shù)zcard方法等等,用起來還是很方便的,但是還是那句話具體的只能到具體的業(yè)務里才知道實用不,而且還要注意Redis有數(shù)據(jù)淘汰策略,這個點也千萬不要忽視了,還有就是針對已經廢棄的業(yè)務數(shù)據(jù)還在緩存在Redis的里也要記得檢查和清除掉。
到此這篇關于Redis實現(xiàn)排名功能的示例代碼的文章就介紹到這了,更多相關Redis 排名內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot整合Redis實現(xiàn)序列化存儲Java對象的操作方法
這篇文章主要介紹了SpringBoot整合Redis實現(xiàn)序列化存儲Java對象,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
Redis主從配置和底層實現(xiàn)原理解析(實戰(zhàn)記錄)
今天給大家分享Redis主從配置和底層實現(xiàn)原理解析,本文通過實戰(zhàn)項目給大家源碼解析,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-06-06
Redis教程(二):String數(shù)據(jù)類型
這篇文章主要介紹了Redis教程(二):String數(shù)據(jù)類型,本文講解了String數(shù)據(jù)類型概述、相關命令列表、命令使用示例三部分內容,需要的朋友可以參考下2015-04-04

