名师大咖排行榜-redis的zset实现排行榜

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: springboot 专栏: 新版在线教育项目 标签: 排行榜 redis

2024-06-14 18:23:20 792浏览

redis的zset实现排行榜

需求

我要做的功能是:首页的名师大咖面板展示最受欢迎的四位老师(所授的课被购买的越多越牛)

核心代码-往zset里加数据

在购买课程的回调中就应该向redis里添加zset数据结构的数据


 //讲师排行数据
 redisTemplate.opsForZSet().incrementScore("teacherBuyCount",order.getTeacherId(),1);//原有次数+1(每次购买都算加一次)

展示数据的核心代码

 

    @Operation(summary = "名师大咖")
    @GetMapping("/teacher")
    public ResultVo getHotTeacher(){

        //要降序的
        Set zset = redisTemplate.opsForZSet().reverseRange("teacherBuyCount", 0, 3);//查排在前面四个老师
        if(zset.size()>0){//zset里有数据的时候
            LambdaQueryWrapper<EduTeacher> queryWrapper= new LambdaQueryWrapper<>();

            //保证我的id顺序
            String orderSql = this.makeOrderByFieldSql("id", zset);
            // 使用in函数指定要查询的ID列表
            queryWrapper.in(EduTeacher::getId, zset).last(orderSql);

            // 执行查询
            List<EduTeacher> list = teacherService.list(queryWrapper);
            return ResultVo.success(list);
        }else{//zet里没东西的时候(还没一个人买任何老师的课)

            Page<EduTeacher> page = teacherService.page(new Page<>(1, 4));
            // 执行查询
            List<EduTeacher> list =page.getRecords();
            return ResultVo.success(list);

        }
    }

    private String makeOrderByFieldSql(String fieldName, Set<String> fields) {

        StringBuilder orderSql = new StringBuilder();
        orderSql.append("ORDER BY FIELD(").append(fieldName).append(",");
        for (String field : fields) {
            orderSql.append("\"").append(field).append("\"").append(",");
        }
        //去除最后一个 ",",加上括号
        orderSql.deleteCharAt(orderSql.length() - 1).append(")");
        return orderSql.toString();
    }

redis里的数据

注意:使用“IN“语句查询时保持顺序怎么操作

参考文章:https://blog.csdn.net/GUILTYxc/article/details/132950592


好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695