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

(完)

相关推荐
需要8263 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡3 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
凤山老林4 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne5 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF5 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_5 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li6 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
省钱兄--zs6 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲6 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老