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

(完)

相关推荐
a3158238069 小时前
Android Framework开发知识点整理
android·java·linux·服务器·framework·android源码开发
毕设源码-朱学姐9 小时前
【开题答辩全过程】以 个人健康管理系统为例,包含答辩的问题和答案
java·spring boot
局外人Inside9 小时前
PostProcessingBeanDeserializer 使用指南
java
郑州光合科技余经理10 小时前
基于PHP:海外版同城O2O系统多语言源码解决方案
java·开发语言·git·spring cloud·uni-app·php·uniapp
IT_Octopus10 小时前
Java GZip 压缩实践 +实践思考 +进一步压榨性能和存储方案思考:Protobuf+ GZip
java·spring boot
计算机毕设匠心工作室10 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
前端之虎陈随易10 小时前
MoonBit内置数据结构详解
数据结构·数据库·redis
毕设源码-郭学长10 小时前
【开题答辩全过程】以 高校教材大管家系统为例,包含答辩的问题和答案
java·spring boot
摆烂工程师10 小时前
2025年12月最新的 Google AI One Pro 1年会员教育认证通关指南
前端·后端·ai编程
Gavin在路上10 小时前
DDD之用事件风暴重构“电商订单履约”(11)
java·前端·重构