关于java基于redis有序集合实现排行榜


当前第2页 返回上一页

在这里插入图片描述

因为排行榜对实时性要求比较高,个人认为没必要进行持久化到数据库

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

/**

 * 根据公司名找到指定公司

 * @param companyName

 * @return

 */

@Override

public AjaxResult selectCompanyName(String companyName) {

    Set<Object> set =  redisUtils.sGet("company");

    for(Object i : set){

        String json = JSONObject.toJSONString(i);

        JSONObject jsonObject = JSONObject.parseObject(json);

        if(jsonObject.getString("companyName").equals(companyName)){

            //搜索次数 + 1

            redisUtils.sortSetZincrby("companyRank",companyName,1);

            log.info("直接缓存中返回");

            return new AjaxResult().ok(jsonObject);

        }

    }

    log.error("缓存中没有,查数据库");

    TbCommpanyExample tbCommpanyExample = new TbCommpanyExample();

    tbCommpanyExample.createCriteria().andCompanyNameEqualTo(companyName);

    List<TbCommpany> list = tbCommpanyMapper.selectByExample(tbCommpanyExample);

    if(list.size() != 0){

        //放入缓存中

        redisUtils.sSet("company",list.get(0));

        //数据库中存在

        //搜索次数 + 1

        redisUtils.sortSetZincrby("companyRank",companyName,1);

        log.info("sql");

        return new AjaxResult().ok(list.get(0));

    }else{

        return new AjaxResult().error("没有找到该公司:"+companyName);

    }

}

获取排名

1

2

3

4

5

6

7

8

9

10

11

12

/**

 * 获得公司排行榜(前十)

 * @return

 */

@Override

public AjaxResult getCompanyRank() {

    Set set = redisUtils.sortSetRange("companyRank",0,9);

    if(set.size() == 0){

        return new AjaxResult().error("公司排行榜为空");

    }

    return new AjaxResult().ok(set);

}

3.测试与总结

在这里插入图片描述

postman测试:

在这里插入图片描述

还有一个问题就是相同分数的排行问题

如果我希望A是先到的排在相同分数但是后到的B前边,这个问题该如何解决呢?

要解决这个问题,我们可以考虑在分数中加入时间戳,计算公式为:

1

带时间戳的分数 = 实际分数*10000000000 + (9999999999 ?C timestamp)

这个带时间的公司可以自己编写,尽量缩减误差

以上就是关于java基于redis有序集合实现排行榜的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

redis如何实现限流?3种实现方式介绍

什么是redis读写分离

redis是线程安全的吗

redis主从复制什么时候复制

redis压缩列表的详细介绍(示例讲解)

使用redis-dump与redis-load方式迁移redis数据库

redis怎么实现缓存

redis启动与连接的方法

redis中sorted-sets类型的命令详细介绍

redis一般运用在哪里

更多相关阅读请进入《Java》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...