日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

手把手教你使用 Java 和 Redis 实现排行榜!

發(fā)布時(shí)間:2023/12/29 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你使用 Java 和 Redis 实现排行榜! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編輯:業(yè)余草
來源:https://www.xttblog.com/?p=4937

前言

排行榜作為互聯(lián)網(wǎng)應(yīng)用中幾乎必不可少的一個(gè)元素,其能夠勾起人類自身對(duì)比的欲望,從而來增加商品的銷量。排行榜的實(shí)現(xiàn)方式基本大同小異,大部分都基于 Redis 的有序集合 sorted set 來實(shí)現(xiàn)。不久前,負(fù)責(zé)開發(fā)一個(gè)活動(dòng),就有排行榜這個(gè)需求,筆者也使用 Redis 進(jìn)行了實(shí)現(xiàn)。本文通過了商品銷售排行榜這一模型,來進(jìn)行演示。

需求

  • 按照商品銷量進(jìn)行排行

  • 可以獲得指定商品的排名

  • 顯示實(shí)時(shí)銷售動(dòng)態(tài)情況

  • 需求分析

    分析需求,以上這些都可以通過 Redis 的有序集合相關(guān)命令進(jìn)行實(shí)現(xiàn),首先看一下使用到的具體 Redis 命令。

    redis> ZADD bangdan 1 "one" (integer) 1 # 對(duì)有序集合中指定成員的分?jǐn)?shù)加上增量 redis> zadd bangdan 1 "one" 4 "three" 3 "two" (integer) 2 # 將一個(gè)或多個(gè)成員以及分?jǐn)?shù)加入到有序集合中 redis> zrange bangdan 0 1 1) "one" 2) "three" # 按照 score 升序排列 ,取出前兩名 redis> zscore bangdan three "4" # 獲得榜單中指定元素的score redis> zrank bangdan one (integer) 0 # 在升序榜中的名次 第一返回0 # 第三個(gè)需求需要使用 Redis 的 list 來進(jìn)行實(shí)現(xiàn) redis> LPUSH dynamic abc (integer) 1 # 向隊(duì)列左側(cè)頭部 push 數(shù)據(jù) redis> LINDEX dynamic 0 "abc" # 通過索引獲取列表中的元素 redis> LTRIM dynamic 0 2 "abc" # 對(duì)一個(gè)列表進(jìn)行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除

    排行榜預(yù)覽

    按照需求開發(fā),最后的效果如下:

    下面我們通過 Java 實(shí)現(xiàn)它!

    引入依賴

    項(xiàng)目中使用到了 Redis,因此需要引入相關(guān)依賴,為了簡明演示,這里沒有使用 JedisPool。

    <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.7.3</version> </dependency>

    主要代碼

    1、頁面上點(diǎn)擊一次購買按鈕,則對(duì)該手機(jī)的銷量加 1,同時(shí)將銷售動(dòng)態(tài)添加到隊(duì)列當(dāng)中。

    jedis.zincrby(Constants.SALES_LIST, 1, String.valueOf(phoneId)); jedis.lpush(Constants.BUY_DYNAMIC, msg);

    2、獲得排行榜。

    // 按照scope升序排名,取出前五 jedis.zrevrangeWithScores(Constants.SALES_LIST, 0, 4);

    3、獲得指定手機(jī)的排名情況。

    jedis.zrevrank(Constants.SALES_LIST, String.valueOf(phoneId));

    4、獲得銷售動(dòng)態(tài),此處只取 3 條,同時(shí)隊(duì)列只保存最新的 20 條動(dòng)態(tài)。

    List<DynamicVO> dynamicList = new ArrayList<>(); for (int i = 0; i < 3; i++) {String result = jedis.lindex(Constants.BUY_DYNAMIC, i);if (StringUtils.isEmpty(result)) {break;}String[] arr = result.split(Constants.separator);long time = Long.valueOf(arr[0]);String phone = arr[1];DynamicVO vo = new DynamicVO();vo.setPhone(phone);vo.setTime(StringUtil.showTime(new Date(time)));dynamicList.add(vo); } jedis.ltrim(Constants.BUY_DYNAMIC, 0, 19);

    5、因?yàn)榕判邪襁@種實(shí)時(shí)性比較強(qiáng)的數(shù)據(jù),更新比較快,個(gè)人覺得沒有必要進(jìn)行持久化,如果 Redis 的排行榜數(shù)據(jù)丟失,可以通過代碼重新計(jì)算排行,通過 zadd 命令,重新添加到 Redis 中即可。

    Map<String, Double> map = new HashMap<>();map.put("1", 4.0);map.put("2", 2.0);map.put("3", 3.0); jedis.zadd(Constants.SALES_LIST, map);

    上面是主要的實(shí)現(xiàn)代碼,還有不少細(xì)節(jié)需要完善。需要源代碼的可以加我VX號(hào):codedq,免費(fèi)獲取!

    總結(jié)

    以上是生活随笔為你收集整理的手把手教你使用 Java 和 Redis 实现排行榜!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。