热词统计-redis实现
需求说明:在开发的过程中,接口请求数据携带了关键词,我们需要将这些关键词统计出来进行数据分析,需要知道每一个词出现的次数
选择使用redis来做简单实现
服务实现类
package com.hhmt.delivery.service.impl;
import com.hhmt.delivery.service.RedisStatisticsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;
import java.util.Set;
/**
* @author huachun
* @version 1.0
* @description: TODO
* @email huachun_w@163.com
* @date 2023-05-25 10:34
*/
@Service
@Slf4j
public class RedisStatisticsServiceImpl implements RedisStatisticsService {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* @param keyword 关键词
* @return void
* @description: 使用Sorted Set记录keyword
* zincrby命令,对于一个Sorted Set,存在的就把分数加x(x可自行设定),不存在就创建一个分数为1的成员
* @author huachun
* @email huachun_w@163.com
* @date 2023/5/25 10:36
*/
@Override
public void searchZincrby(String sortedSetName,String keyword) {
// 名为sortedSetName的Sorted Set不用预先创建,不存在会自动创建,存在则向里添加数据
// String sortedSetName = "searchHotWord";
// x 的含义请见本方法的注释
double x = 1.0;
redisTemplate.opsForZSet().incrementScore(sortedSetName, keyword, x);
}
/**
* @param start 查询范围开始位置
* @param end 查询范围结束位置
* @return java.util.Set<org.springframework.data.redis.core.ZSetOperations.TypedTuple < java.lang.String>>
* @description: zrevrange命令, 查询Sorted Set中指定范围的值返回的有序集合中,score大的在前面zrevrange方法无需担心用于指定范围的start和end出现越界报错问题
* @author huachun
* @email huachun_w@163.com
* @date 2023/5/25 10:38
*/
@Override
public Set<ZSetOperations.TypedTuple<String>> queryTopSearchHotWord(String sortedSetName,Integer start, Integer end) {
return redisTemplate.opsForZSet().reverseRangeWithScores(sortedSetName, start, end);
}
/**
* @param keyName
* @return void
* @description: 删除指定的key
* @author huachun
* @email huachun_w@163.com
* @date 2023/5/25 10:39
*/
@Override
public void deleteKey(String keyName) {
redisTemplate.delete(keyName);
}
}
控制层实现类
package com.hhmt.delivery.controller;
import com.hhmt.delivery.pojo.model.vo.ResultVO;
import com.hhmt.delivery.service.RedisStatisticsService;
import com.hhmt.delivery.utils.ResultVOUtil;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Set;
/**
* @author huachun
* @version 1.0
* @description: TODO
* @email huachun_w@163.com
* @date 2023-05-25 10:42
*/
@Api(tags = "ADX-流量热词搜索")
@RestController
@RequestMapping("/v1/hot/keyword")
public class HotKeyWordController {
@Autowired
private RedisStatisticsService redisStatisticsService;
/**
* @param sortedSetName
* @param keyword
* @return com.hhmt.delivery.pojo.model.vo.ResultVO
* @description: 测试redis记录keyword
* @author huachun
* @email huachun_w@163.com
* @date 2023/5/25 14:39
*/
@GetMapping("/search")
public ResultVO Search(@RequestParam("sortedSetName") String sortedSetName, @RequestParam("keyword") String keyword) {
redisStatisticsService.searchZincrby(sortedSetName, keyword);
// ResultVO和ResultVOUtil是自定义的class,为了方便展示结果,阅读时忽略即可
return ResultVOUtil.success();
}
/**
* @param sortedSetName
* @param start
* @param end
* @return com.hhmt.delivery.pojo.model.vo.ResultVO
* @description: 测试redis查询指定范围的热词
* @author huachun
* @email huachun_w@163.com
* @date 2023/5/25 14:39
*/
@GetMapping("/search/range")
public ResultVO testQueryTopSearchHotWord(@RequestParam("sortedSetName") String sortedSetName, @RequestParam("start") Integer start,
@RequestParam("end") Integer end) {
Set<ZSetOperations.TypedTuple<String>> resultSet = redisStatisticsService.queryTopSearchHotWord(sortedSetName, start, end);
return ResultVOUtil.success(resultSet);
}
/**
* @param keyName
* @return com.hhmt.delivery.pojo.model.vo.ResultVO
* @description: 删除指定的key
* @author huachun
* @email huachun_w@163.com
* @date 2023/5/25 14:39
*/
@DeleteMapping("/search")
public ResultVO deleteKey(@RequestParam("keyName") String keyName) {
redisStatisticsService.deleteKey(keyName);
return ResultVOUtil.success();
}
}
测试,通过模拟搜索添加热词
通过存储的key和范围查找热词的搜索次数
春卷-huachun: 排版问题
神笔码农s: 问题一原因分析 表述的是人话吗?
春卷-huachun: 没办法,就是这么洒脱,想怎么写就怎么写喽
Map猿: 你写的好乱啊,条理不清晰
春卷-huachun: 确实有漏洞,你发现了些什么