• 排行榜实现


    排行榜作为互联网应用中几乎必不可少的一个元素,其能够勾起人类自身对比的欲望,从而来增加商品的销量。排行榜的实现方式基本大同小异,大部分都基于 Redis 的有序集合 sorted set 来实现。不久前,负责开发一个活动,就有排行榜这个需求,笔者也使用 Redis 进行了实现。本文通过了商品销售排行榜这一模型,来进行演示。

    需求

    1. 按照商品销量进行排行
    2. 可以获得指定商品的排名
    3. 显示实时销售动态情况

    需求分析

    分析需求,以上这些都可以通过 Redis 的有序集合相关命令进行实现,首先看一下使用到的具体 Redis 命令。

    1.  
      redis> ZADD bangdan 1 "one"
    2.  
      (integer) 1
    3.  
      # 对有序集合中指定成员的分数加上增量
    4.  
       
    5.  
      redis> zadd bangdan 1 "one" 4 "three" 3 "two"
    6.  
      (integer) 2
    7.  
      # 将一个或多个成员以及分数加入到有序集合中
    8.  
       
    9.  
      redis> zrange bangdan 0 1
    10.  
      1) "one"
    11.  
      2) "three"
    12.  
      # 按照 score 升序排列 ,取出前两名
    13.  
       
    14.  
      redis> zscore bangdan three
    15.  
      "4"
    16.  
      # 获得榜单中指定元素的score
    17.  
       
    18.  
      redis> zrank bangdan one
    19.  
      (integer) 0
    20.  
      # 在升序榜中的名次 第一返回0
    21.  
       
    22.  
      # 第三个需求需要使用 Redis 的 list 来进行实现
    23.  
       
    24.  
      redis> LPUSH dynamic abc
    25.  
      (integer) 1
    26.  
      # 向队列左侧头部 push 数据
    27.  
       
    28.  
      redis> LPUSH dynamic 0
    29.  
      "abc"
    30.  
      # 通过索引获取列表中的元素
    31.  
       
    32.  
      redis> LTRIM dynamic 0 2
    33.  
      "abc"
    34.  
      # 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

    排行榜预览

    按照需求开发,最后的效果如下:

    20180610152859148695744.png

    以下通过 Java 代码实现。

    通过 Java 实现排行榜

    引入依赖

    项目中使用到了 Redis,因此需要引入相关依赖,为了简明演示,这里没有使用 JedisPool。

    1.  
      <dependency>
    2.  
      <groupId>redis.clients</groupId>
    3.  
      <artifactId>jedis</artifactId>
    4.  
      <version>2.7.3</version>
    5.  
      </dependency>

    开发逻辑

    1. 页面上点击一次购买按钮,则对该手机的销量加 1,同时将销售动态添加到队列当中

      1.  
        jedis.zincrby(Constants.SALES_LIST, 1, String.valueOf(phoneId));
      2.  
        jedis.lpush(Constants.BUY_DYNAMIC, msg);
    2. 获得排行榜
      java // 按照scope升序排名,取出前五 jedis.zrevrangeWithScores(Constants.SALES_LIST, 0, 4);
    3. 获得指定手机的排名情况
      java jedis.zrevrank(Constants.SALES_LIST, String.valueOf(phoneId));
    4. 获得销售动态,此处只取 3 条,同时队列只保存最新的 20 条动态
      ```java
      List 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. 因为排行榜这种实时性比较强的数据,更新比较快,个人觉得没有必要进行持久化,如果 Redis 的排行榜数据丢失,可以通过代码重新计算排行,通过 zadd 命令,重新添加到 Redis 中即可。
      java 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);

    源码下载

    点我下载

    转载于:https://www.cnblogs.com/vcmq/p/9484430.html

  • 相关阅读:
    Thread.Join
    WPF几个基础概念的浅显理解
    Vue v-bind指令
    Vue设置路由跳转的两种方法: <router-link :to="..."> 和router.push(...)
    前端上传视频、图片、文件等大文件 组件Plupload使用指南
    vue如何获取并操作DOM元素
    css中border-sizing属性详解和应用
    vue使用axios发送post请求时的坑及解决原理
    vue中的js引入图片,使用require相关问题
    vue 动态添加body背景图片
  • 原文地址:https://www.cnblogs.com/cgfpx/p/11750117.html
Copyright © 2020-2023  润新知