<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
之前在消費金融平臺的時候,公司有一個專門給線下銷售人員使用的APP,APP記錄銷售推廣公司貸款產品賺取的佣金以及一些門店開拓和打卡的功能,後端是由我和另外一個同事開發的,其中有一個模組是全國門店內的銷售佣金實時排名,說到排名很多人的第一反應都是這是個Top N的問題,從資料庫取出來用MySQL的top函數不就可以實現了,事實上當時無法從表裡取到資料,資料還要配合許可權,有全國和大區的排名,還需要計算大區經理下所有人員的有效佣金,還要求是實時的,從資料庫讀取再計算肯定不行,跳到排名頁至少等待5s左右資料才能出來,那怎麼辦呢,可以放Redis裡,那麼接下來我們一起看看如何用Redis實現這個排名功能。
使用的是Redis裡zset資料型別,zset的定義這裡總結一下就是其每個元素都能夠關聯一個分數而且還能夠針對集合元素進行排序,所以這點很合適用來排序,接下來我們一起看看如何用其實現排名功能。
1.新增資料的方法包裝
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.獲取資料的方法包裝
public Set<Object> zRange(String key,int start,int end){ try { //按照位置倒序取值和分數 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的資料,使用上面2方法 Set<Object> rank = redisUtils.zRange("rank", 0, 9); //todo 拿到資料進行其他邏輯處理 //列印結果 rank.forEach(System.out::println);
4.執行結果
[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裡除了計算排名的方法還有計算集合條件內個數的zcount方法,檢視集合總個數zcard方法等等,用起來還是很方便的,但是還是那句話具體的只能到具體的業務裡才知道實用不,而且還要注意Redis有資料淘汰策略,這個點也千萬不要忽視了,還有就是針對已經廢棄的業務資料還在快取在Redis的裡也要記得檢查和清除掉。
到此這篇關於Redis實現排名功能的範例程式碼的文章就介紹到這了,更多相關Redis 排名內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45