使用Redis实现记录访问次数的三种方案
作者:睆小白
这篇文章主要介绍了使用Redis实现记录访问次数的三种方案,文中通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
0. 前言
准备一个Controller,用来测试。
@RestController @RequestMapping("test") @Tag(name = "测试",description = "测试springMVC拦截器实现记录访问次数") public class TestController { @GetMapping("getInfo/{id}") public String test(@PathVariable Integer id) { switch (id){ case 1: return "1"; case 2: return "2"; default: return "3"; } } }
访问次数,记录用户访问的次数,一般有如下几种方案:
1. 使用Filter实现
emm有点麻烦,以后再说。
2. 使用AOP实现
1. 导入依赖
<!-- AOP依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2. 写一个切面类,实现统计访问次数。
@Aspect // 表示这是一个切面 @Component // 托管到spring容器中 public class AccessRecordAspect { @Autowired private RedisTemplate<String,Object> redisTemplate; // 定义切点 匹配TestController中的test*方法 @Pointcut("execution(* com.huan.web.controllers.TestController.test*(..))") public void a(){} // 使用后置增强,在方法正确执行后执行 @AfterReturning("a()") public void record(JoinPoint joinPoint){ System.out.println("记录访问记录"); // 获取目标方法参数 Object[] args = joinPoint.getArgs(); System.out.println(args[0]); redisTemplate.opsForValue().increment("访问的数据:"+args[0]); } }
3. 开启AOP
@Configuration @ComponentScan @EnableCaching // 开启缓存功能 @EnableAspectJAutoProxy // 开启aop功能 public class AppConfig { }
4. 测试
访问http://localhost:8080/test/getInfo/1
进行测试,测试结果。
5. plus版本
使用循环增强实现,并将将redis中的记录的数据返回给前端。
(1) 新建一个bean类
@Data @AllArgsConstructor @NoArgsConstructor @ToString public class TestBean { private Integer id; private Long praise; }
(2) 新增一个controller方法
在新增的controller方法中,返回一个map,将数据返回给前端。
@GetMapping("getInfo-getPraise/{id}") public Map<String,Object> testPraise(@PathVariable Integer id) { Map<String,Object> map = new HashMap<>(); TestBean testBean = null; testBean.setId(id); map.put("code",1); map.put("obj",testBean); return map; }
(3) 新增一个循环增强方法
在新增的循环增强方法中,统计访问次数,并将访问次数返回给前端。
@Pointcut("execution(* com.huan.web.controllers.TestController.testPraise*(..))") public void c(){} @Around("c()") public Object showPraise_test(ProceedingJoinPoint joinPoint){ System.out.println("showPraise_test显示点赞数"); //运行目标方法返回的值 Object proceed = null; try { proceed = joinPoint.proceed(); } catch (Throwable e) { throw new RuntimeException(e); } Map<String,Object> map = (Map<String, Object>) proceed; TestBean testBean = (TestBean) map.get("obj"); testBean.setPraise(redisTemplate.opsForValue().increment("PraiseNumById-test:"+testBean.getId())); return proceed; }
(4) 测试
3. 使用springMVC拦截器实现
1. 配置拦截器
@Configuration @ComponentScan("com.huan.web") public class InterceptorConfig implements WebMvcConfigurer { //这里需要注入拦截器,确保 RedisTemplate 在拦截器之前被正确创建和注入 @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //将一个新的 MyInterceptor 实例添加到拦截器注册表中 //拦截/resfood/getById-map/*所有请求 registry.addInterceptor(myInterceptor).addPathPatterns( "/resfood/getById-map/**"); } }
注意如果这里没有注入拦截器,可能会因为由于 RedisTemplate
没有正确注入到你的拦截器中导致空指针异常(如下图)。
2. 定义拦截器
在拦截器中使用RedisTemplate记录访问的次数。
@Component public class MyInterceptor implements HandlerInterceptor { /* Spring Data Redis 提供的一个模板类,用于简化与 Redis 数据库的交互 类似于map类型,可以存储和检索各种类型的数据,包括字符串、对象、集合等。 但是,它提供了一些额外的功能,如键的过期时间、哈希表操作、列表操作等。 */ @Autowired private RedisTemplate<String,Object> redisTemplate; /** * 在请求处理之后,视图渲染之前执行,用于进行资源清理 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); //输出接收的请求 System.out.println(request.getRequestURI()); String[] key = request.getRequestURI().split("/"); System.out.println(Arrays.toString(key)); // 操作值 自增1 键名为key[2]+":"+key[3]形成的新字符串 redisTemplate.opsForValue().increment(key[2]+":"+key[3]); } }
3. 控制器类
写一个简单的测试的控制器类。
@RestController @RequestMapping("test") //swagger注解 @Tag(name = "测试",description = "测试springMVC拦截器实现记录访问次数") public class TestController { //rest风格url @GetMapping("getInfo/{id}") public String test(@PathVariable Integer id) { switch (id){ case 1: return "1"; case 2: return "2"; default: return "3"; } } }
4. 测试
在测试前在idea中查看redis中的数据,在测试前redis中没有任何数据。
在浏览器地址栏(或其他工具)输入localhost:8080/test/getInfo/1,进行测试。
控制台输出。
再次查看redis中的数据,发现多了键值,也记录了访问数据。
以上就是使用Redis实现记录访问次数的三种方案的详细内容,更多关于Redis记录访问次数的资料请关注脚本之家其它相关文章!