使用Redis实现热搜功能

Redis热搜

原理

使用redis实现热搜的原理就是维护一个zset集合,然后使用score作为当前搜索词的搜索量,score越高的搜索词就说明该搜索词热度越高。然后在每天凌晨十二点对热搜榜进行维护,将前十名热搜删除,防止热搜霸榜(这里有更好的热搜榜单维护方式,感兴趣的小伙伴可以自己了解一下)。

数据类型

使用redis中的zset类型,主要使用的方法有两个:

zincrby: 对zset中的元素score进行自增自减操作

zrevrange:降序获得zset中的热搜榜单

写到这里大家应该已经明白了,当用户搜索时,使用zincrby方法对搜索词的score进行自加操作。查询热搜榜单时,使用zrevrange获得热搜前几名的搜索词。

redis操作简单实现

首先创建一个zset集合

现在我们向zset中添加几条数据

假设现在搜索词为5的数据被五个用户分别搜索了五次,使用zincrby模拟该操作。

现在执行查询操作,查出热榜上前五的搜索词,使用zrevrange模拟该操作。

至此理论成立,开始实践!

实操

封装方法

首先在redis的工具类中封装zincrby和zrevrange两个方法

java 复制代码
	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进行更改

java 复制代码
//condition是搜索条件
RedisTemplateUtil.zincrby(RedisConstants.HOTSELECT , condition , 1);

写一下查询接口

java 复制代码
	@GetMapping("/getHotSelect")
    @ApiOperation("获取热搜榜单")
    @ApiImplicitParam(name = "count" , value = "获取数量")
    public Result getHotSelect(int count){
        if(count <= 0){
            return Result.BAD_REQUEST();
        }
        return videoService.getHotSelect(count);
    }

service:

java 复制代码
	@Override
    public Result getHotVideo(int count) {
        Set zrevrange = RedisTemplateUtil.zrevrange(RedisConstants.HOTVIDEO, 0, count - 1);
        return Result.OK(zrevrange);
    }

最后使用springboot的定时任务对热搜榜单进行维护

笔者这里写的是每天凌晨将前十个热搜删除,这个方法写的比较烂,大家可以自己查询学习一下比较好的热搜算法,对热搜进行维护。(可以将这些数据放入mysql统一管理或者使用一个变量作为热度因子对热搜真实热度进一步统计)

java 复制代码
	@Scheduled(cron = "0 0 0 * * *")
    private void deletehotSelect(){
        for(int i = 0;i<10;i++){
            redisTem.opsForZSet().popMax(RedisConstants.HOTSELECT);
        }
    }

(完)

相关推荐
合作小小程序员小小店11 分钟前
web网页开发,在线%图书管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·后端·mysql·jdk·intellij-idea
IUGEI12 分钟前
【MySQL】SQL慢查询如何排查?从慢查询排查到最终优化完整流程
java·数据库·后端·mysql·go
EndingCoder31 分钟前
会话管理与Cookie安全
redis·安全·缓存·it·cookie
程序员-周李斌1 小时前
Java NIO [非阻塞 + 多路复用解]
java·开发语言·开源软件·nio
程序猿小蒜1 小时前
基于Spring Boot的宠物领养系统的设计与实现
java·前端·spring boot·后端·spring·宠物
合作小小程序员小小店1 小时前
web网页开发,在线%食堂管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·html·intellij-idea·jquery
奋斗的小高1 小时前
Docker 安装与使用
java
毕设源码-钟学长1 小时前
【开题答辩全过程】以 浮生馆汉服租赁管理系统为例,包含答辩的问题和答案
android·java·tomcat
90后小陈老师1 小时前
用户管理系统 07 项目前端初始化 | 新手实战 | 期末实训 | Java+SpringBoot+Vue
java·前端·spring boot
k***82511 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker