博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现排行榜基于Redis
阅读量:5902 次
发布时间:2019-06-19

本文共 2065 字,大约阅读时间需要 6 分钟。

前言

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

需求

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

需求分析

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

redis> ZADD bangdan 1 "one"(integer) 1# 对有序集合中指定成员的分数加上增量redis> zadd bangdan 1 "one" 4 "three" 3 "two"(integer) 2# 将一个或多个成员以及分数加入到有序集合中redis> zrange bangdan 0 11) "one"2) "three"# 按照 score 升序排列 ,取出前两名redis> zscore bangdan three"4"# 获得榜单中指定元素的scoreredis> zrank bangdan one(integer) 0# 在升序榜中的名次 第一返回0# 第三个需求需要使用 Redis 的 list 来进行实现redis> LPUSH dynamic abc(integer) 1# 向队列左侧头部 push 数据redis> LPUSH dynamic 0"abc"# 通过索引获取列表中的元素redis> LTRIM dynamic 0 2"abc"# 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

排行榜预览

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

20180610152859148695744.png

以下通过 Java 代码实现。

通过 Java 实现排行榜

引入依赖

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

redis.clients
jedis
2.7.3

开发逻辑

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

    jedis.zincrby(Constants.SALES_LIST, 1, String.valueOf(phoneId));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

你可能感兴趣的文章
清华大学:模拟电子技术基础
查看>>
Java中常用的内存区域
查看>>
使用Nginx容器
查看>>
中级学员:2015年10月15日作业
查看>>
Filebeat 日志收集器 安装和配置
查看>>
磁盘和文件系统管理
查看>>
基于SaltStack完成LVS的配置管理
查看>>
即时通讯过程中如何设置音视频质量参数
查看>>
海洋个人简历软件
查看>>
hdu 6050 Funny Function 矩阵快速幂
查看>>
Java学习笔记—第五章 运算符和表达式
查看>>
我的友情链接
查看>>
nginx+set-misc-nginx-module模块说明
查看>>
Linux内核TCP/IP参数优化
查看>>
python的import与from...import的不同之处
查看>>
汇聚层
查看>>
[MongoDB]------windos远程服务器部署连接
查看>>
MySQL VIEW 安全验证
查看>>
我的友情链接
查看>>
Gitlab-runner 构建失败问题排查
查看>>