当前位置: 首页 > article >正文

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

目录

  • 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 {
    @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拦截器实现

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

在这里插入图片描述


http://www.kler.cn/a/292278.html

相关文章:

  • 使用 Redis 作为消息队列 - Pub/Sub, List, SortedSet
  • K8S 查看pod节点的磁盘和内存使用情况
  • 面试时问到软件开发原则,我emo了
  • Android ART知多少?
  • Apache Paimon、Apache Hudi、Apache Iceberg对比分析
  • flutter pigeon gomobile 插件中使用go工具类
  • pytorch 模型部署
  • 新增一个数组传递给后端
  • C++基础知识(五)
  • 计算机网络(三) —— 简单Udp网络程序
  • 2024年西安交通大学软件工程专业考研915真题
  • 算法练习题14——leetcode84柱形图中最大的矩形(单调栈)
  • 深度解析Linux系统的基本概念及优缺点和原理
  • COD论文笔记 ECCV2024 Just a Hint: Point-Supervised Camouflaged Object Detection
  • 解决maven中阿里云镜像仓库无法下载源码的问题
  • 华为od统一考试B卷【密钥格式化】Java 实现
  • python多进程
  • 导入word模板的数据到DB,偏自学,可自改套用
  • eureka一
  • 如何给 Java 文件打成独立的 JAR 包
  • 最基本的SELECT...FROM结构
  • HTB-Funnel(ssh端口转发与Hydra爆破)
  • blast的快速安装使用-简易版
  • Python知识点:如何使用Slack与Python进行团队协作
  • C++的四种规范的类型转换
  • 广义回归神经网络(GRNN)