使用Redis实现记录访问次数(三种方案)

ops/2024/11/13 9:46:08/

目录

  • 0. 前言
  • 1. 使用Filter实现
  • 2. 使用AOP实现
      •       1. 导入依赖
      •       2. 写一个切面类,实现统计访问次数。
      •       3. 开启AOP
      •       4. 测试
      •       5. plus版本
        •       (1) 新建一个bean类
        •       (2) 新增一个controller方法
        •       (3) 新增一个循环增强方法
        •       (4) 测试
  • 3. 使用springMVC拦截器实现

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实现

      在springboot中使用AOP。

      1. 导入依赖

<!--        AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

      2. 写一个切面类,实现统计访问次数。

@Aspect // 表示这是一个切面
@Component // 托管到spring容器中
public class AccessRecordAspect {@Autowiredprivate 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拦截器实现

      在我之前的文章里写过,这里就不重复了。

在这里插入图片描述


http://www.ppmy.cn/ops/108134.html

相关文章

亚马逊测评自养号卖家如何以低成本提高店铺产品曝光率和销量?

在跨境电商领域&#xff0c;随着市场日趋饱和和竞争加剧&#xff0c;卖家普遍面临流量低、转化率低的共同挑战。为了在这种严重的“内卷化”环境中脱颖而出&#xff0c;不少卖家投入了大量的资金和资源&#xff0c;尝试了各种站内和站外的推广方式&#xff0c;但往往因为缺乏成…

原装N9000B信号分析仪keysight/N9000B,N9000A详情参数

是德Keysight N9000B CXA 信号分析仪&#xff0c;多点触控&#xff0c; 特征&#xff1a; 9 kHz 至 26.5 GHz 的宽频率范围以及高达 25 MHz 的分析带宽让您了解更多 为手动和自动化制造测试系统添加可靠的信号分析 执行基本测量&#xff0c;例如杂散搜索和失真分析 使用可选…

牛客周赛 Round 59(下)

逆序数 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n,k;cin>>n>>k;ll sum(n*(n-1))/2;cout<<sum-k<<endl;return 0; } 代码思路 组合数的计…

设计模式之状态模式 (C++ 实现)

设计模式是软件开发中的一项重要技能&#xff0c;它提供了一种通用的解决方案以应对不同的设计问题。状态模式是一种行为型设计模式&#xff0c;适用于对象在不同状态下表现出不同的行为。通过实现状态模式&#xff0c;可以让代码更清晰、更易扩展与维护。本文将通过C实现状态模…

Spring6梳理7——依赖注入之特殊类型属性

目录 ①字面量赋值 ②null值 ③xml实体 ④CDATA节 ①字面量赋值 什么是字面量&#xff1f; int a10; 字面量是在源代码中用来表示固定值的表示法。几乎所有的计算机编程语言都支持基本值的字面量表示&#xff0c;例如整数、浮点数和字符串。许多语言还支持布尔类…

在亚马逊云科技上利用Agent和生成式AI写小说(下篇)

今天小李哥将继续介绍亚马逊推出的国际前沿人工智能AI大模型平台Amazon Bedrock上的Agent的功能。我们将利用Agent结合应用代码工作流服务Step Functions创建链式提示词&#xff08;Prompt Chaining&#xff09;&#xff0c;通过提示词执行一系列调用Amazon Bedrock上AI大模型的…

Scikit-learn与TensorFlow哪个好

Scikit-learn 和 TensorFlow 是两款非常流行的机器学习库&#xff0c;但它们适合的使用场景不同&#xff0c;取决于任务的复杂性和需求。让我们比较一下它们的特点&#xff0c;帮助你选择合适的工具。 1. Scikit-learn Scikit-learn 是一个经典的机器学习库&#xff0c;主要用…

C++:类与对象

一、面向对象编程 (一) 面向过程vs面向对象 面向过程&#xff08;Procedural-Oriented-Programming&#xff0c; POP&#xff09;和面向对象&#xff08;Object-Oriented-Programming&#xff0c;OOP&#xff09;&#xff0c;是两种典型的编程范式&#xff0c;通常是作为划分编…