使用Redis实现热搜功能-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Redis热搜
原理
使用redis实现热搜的原理就是维护一个zset集合然后使用score作为当前搜索词的搜索量score越高的搜索词就说明该搜索词热度越高。然后在每天凌晨十二点对热搜榜进行维护将前十名热搜删除防止热搜霸榜这里有更好的热搜榜单维护方式感兴趣的小伙伴可以自己了解一下。
数据类型
使用redis中的zset类型主要使用的方法有两个
zincrby: 对zset中的元素score进行自增自减操作
zrevrange:降序获得zset中的热搜榜单
写到这里大家应该已经明白了当用户搜索时使用zincrby方法对搜索词的score进行自加操作。查询热搜榜单时使用zrevrange获得热搜前几名的搜索词。
redis操作简单实现
首先创建一个zset集合
现在我们向zset中添加几条数据
假设现在搜索词为5的数据被五个用户分别搜索了五次使用zincrby模拟该操作。
现在执行查询操作查出热榜上前五的搜索词使用zrevrange模拟该操作。
至此理论成立开始实践
实操
封装方法
首先在redis的工具类中封装zincrby和zrevrange两个方法
public static void zincrby(String key , Object value , double score){
//不管有没有该数据先add一边如果有该语句不执行如果没有就创建一条数据。
//使用add会覆盖原来score
redisTem.opsForZSet().addIfAbsent(key , value , 0);
//获取原来的score
Double score1 = redisTem.opsForZSet().score(key, value);
//自增
redisTem.opsForZSet().add(key , value , score1+ score);
}
public static Set zrevrange(String key , long start , long end){
return redisTem.opsForZSet().reverseRange(key , start , end);
}
执行方法
然后在用户执行搜索操作的时候对搜索词的score进行更改
//condition是搜索条件
RedisTemplateUtil.zincrby(RedisConstants.HOTSELECT , condition , 1);
写一下查询接口
@GetMapping("/getHotSelect")
@ApiOperation("获取热搜榜单")
@ApiImplicitParam(name = "count" , value = "获取数量")
public Result getHotSelect(int count){
if(count <= 0){
return Result.BAD_REQUEST();
}
return videoService.getHotSelect(count);
}
service
@Override
public Result getHotVideo(int count) {
Set zrevrange = RedisTemplateUtil.zrevrange(RedisConstants.HOTVIDEO, 0, count - 1);
return Result.OK(zrevrange);
}
最后使用springboot的定时任务对热搜榜单进行维护
笔者这里写的是每天凌晨将前十个热搜删除这个方法写的比较烂大家可以自己查询学习一下比较好的热搜算法对热搜进行维护。可以将这些数据放入mysql统一管理或者使用一个变量作为热度因子对热搜真实热度进一步统计
@Scheduled(cron = "0 0 0 * * *")
private void deletehotSelect(){
for(int i = 0;i<10;i++){
redisTem.opsForZSet().popMax(RedisConstants.HOTSELECT);
}
}
完
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |