使用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);
        }
    }

(完)

相关推荐
齐 飞13 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
九圣残炎21 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge23 分钟前
Netty篇(入门编程)
java·linux·服务器
LunarCod30 分钟前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
王佑辉1 小时前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航1 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot