概述
最近在学Redis,用Redis实现一个简单的排行榜功能
demo
用到了两张表,用于初始化数据保存
排行榜初始化类:主要功能是在项目启动时将表数据添加到Redis中,Redis中有的数据不做处理,Redis中无的数据将数据添加到Redis中
@Component
public class RankInit implements ApplicationRunner {
@Autowired
private GoodsService goodsService;
@Autowired
private RedisTemplate redisTemplate;
@Override
public void run(ApplicationArguments args) throws Exception {
//redisTemplate.delete(RankConstant.RankKey);
List<GoodsVo> goodsVos = goodsService.listGoodsVo();
goodsVos.forEach(e->{
#redis中根据key和商品id查找对应的值
Long rank = redisTemplate.opsForZSet().reverseRank(RankConstant.RankKey, String.valueOf(e.getId()));
if (Objects.isNull(rank)){
redisTemplate.opsForZSet().add(RankConstant.RankKey,String.valueOf(e.getId()),0);
}
});
}
}
测试类有两个,一个用于给商品的score值加分,模拟用户操作,用户点击一次,该商品的score值加一次,这样榜单排名的效果就出来了
@RequestMapping("easyRank")
public Set easyRank(){
return this.redisTemplate.opsForZSet().reverseRangeWithScores(RankConstant.RankKey, 0, 4);
}
@RequestMapping("addScore")
public String addScore(@RequestParam Long goodId){
this.redisTemplate.opsForZSet().incrementScore(RankConstant.RankKey,String.valueOf(goodId),1);
return "ok";
}
reverseRangeWithScores方法:逆序(从大到小)取出榜单的前5名
incrementScore方法,给指定商品加score值