名师大咖排行榜-redis的zset实现排行榜
分类: 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)展开评论
暂无评论,快来写一下吧
展开评论
他的专栏
他感兴趣的技术