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

news2024/9/22 13:34:54

目录

  • 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.coloradmin.cn/o/2107998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

龙芯+FreeRTOS+LVGL实战笔记(新)——04开启主任务

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇&#xff0c;主要的区别在于实时操作系统的不同&#xff0c;章节的安排和任务的推进保持一致&#xff0c;并对源码做了改进和优化&#xff0c;各位可以先到本人主页下去浏览另一专栏的博客列表&#xff08;目前已撰…

基于OGC300工业级LORA网关与OM201L数传终端的化工厂人员定位系统解决方案

化工行业作为高风险的行业之一&#xff0c;其安全管理一直备受关注。化工生产过程中涉及到各种危险品和复杂的工艺&#xff0c;一旦发生事故&#xff0c;往往会造成严重的人员伤亡和财产损失。因此&#xff0c;化工企业急需一套可靠的安全管理系统来监测安全隐患、预防事故发生…

【2024数模国赛赛题思路公开】国赛A题思路丨附可运行代码丨无偿自提

2024年国赛A题解题思路 【题目分析】 问题1&#xff1a;舞龙队沿螺距为55 cm的等距螺线顺时针盘入&#xff0c;给出300秒内舞龙队每秒的位置和速度 分析思路&#xff1a; 螺线方程&#xff1a; 需要建立螺线方程&#xff0c;以便描述龙头及每节板凳的位置。螺线是基于极坐标系…

图形几何算法 -- 凸包算法

前言 常用凸包算法包括Graham Scan 算法和Jarvis March (Gift Wrapping) 算法&#xff0c;在这里要简单介绍的是Graham Scan 算法。 1、概念 凸包是一个点集所包围的最小的凸多边形。可以想象用一根绳子围绕着一群钉子&#xff0c;绳子所形成的轮廓便是这些钉子的凸包。在计算…

谈谈AI领域的认知误区、机会点与面临的挑战

谈谈AI领域的认知误区、机会点与面临的挑战 最近2年&#xff0c;AI 技术的火爆&#xff0c;到处都能看到大家在讨论AI 的发展与机会。这里我们讨论一下AI 认知的误区&#xff0c;机会点和面临的挑战。 by kimmking AI 认知的误区 这年头掀起了所有人讨论AI热潮的同时&#xf…

使用C语言实现字符推箱子游戏

使用C语言实现字符推箱子游戏 推箱子&#xff08;Sokoban&#xff09;是一款经典的益智游戏&#xff0c;玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子&#xff0c;不能拉箱子。只能将箱子推到…

【内容审核】对审核结果进行封装

目录 1、分析返回结果示例 2、自定义封装类 在【内容审核】Java实现七牛云内容审核功能七牛 java 审核-CSDN博客 中实现了文本、图片和视频的审核功能&#xff0c;但是这些功能灵活性不够&#xff0c;既不能自己设置审核的强度&#xff0c;也不能内容违规的详细信息&#xff…

【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴图卡,有答案

背景需求&#xff1a; 前文提到6宫格数独的图片6*636图&#xff0c;如果将6张任务卡放在一个A4上&#xff0c;看上去6种动物很小&#xff0c;所以我换了一个word模板&#xff0c;变成了2张任务卡放在一个A4上。 【教学类-52-07】20240903动物数独&#xff08;6宫格&#xff0…

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

003: Visual Studio 配置 VTK 开发环境的方法与比较

目录 简介&#xff1a; 1 配置属性方法&#xff1a; 2 创建配置文件 3 在新项目中导入props文件 总结&#xff1a; 简介&#xff1a; 编译好VTK后&#xff0c;在安装目录里面有通常有包含bin,lib和include等文件夹&#xff0c;要在自己的项目里面使用VTK&#xff0c;主要…

如何用c++判断一个类型是vector

如何用c判断一个类型是vector 我们使用模板元编程来搞定 这里我们可以定义一个模板结构体 is_std_vector&#xff0c;并对其进行特化&#xff0c;以便专门处理 std::vector 类型。 . 下面是详细的实现和使用示例。 实现 is_std_vector 类型, 继承自false_type 首先&#xff…

Unexpected token d in JSON at position 5, check bodyParser config错误解决

错误原因&#xff1a;json格式不对 { desc"设备1", iotProjectId11 } 解决&#xff1a;通过json在线校验格式校验json格式&#xff0c;找出错误原因&#xff0c;修改 在线JSON校验格式化工具&#xff08;Be JSON&#xff09; 修改&#xff1a; {"desc": &…

基于SpringBoot的校园博客系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 博主管理…

使用 MongoDB 构建 AI:Patronus 如何自动进行大语言模型评估来增强对生成式 AI 的信心

大语言模型可能不可靠&#xff0c;这几乎算不上头条新闻。对于某些用例&#xff0c;这可能会带来不便。而对于其他行业&#xff0c;尤其是受监管行业&#xff0c;后果则要严重得多。于是&#xff0c;业内首个大语言模型自动评估平台 Patronus AI 应运而生。 Patronus AI 由 Met…

为啥给的贷款额度差距那么大?机构到底是怎么决定给你多少额度?

今日&#xff0c;我们深入探讨一个颇为引人入胜的话题——为何在不同银行或信贷机构申请贷款时&#xff0c;所能获得的额度竟能如此大相径庭&#xff1f;同时&#xff0c;揭秘这些金融机构背后是如何精密计算并决定每位申请者的“额度”的。以下内容干货满满&#xff0c;建议收…

10 先序遍历创建二叉树

这个代码是使用手动输入的方式创建二叉树 比较直观 #include "stdio.h" #include "stdlib.h"typedef int ElemType; typedef struct node {ElemType data;struct node *lchild;struct node *rchild; } Node;Node *create_node(int value) {Node *node (N…

2024国赛数学建模B题思路模型

完整的思路模型请查看文末名片

2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。此题涉及对一个动态系统的建模&#xff0c;模拟…

弹框用户勾选过得置灰 或者不显示

弹框用户勾选过得置灰 或者不显示 添加 :disabled“row.disabled” <el-table-column label"名称" width"300"><template #default"{ row }"><el-radio:disabled"row.disabled":label"row.coursesName"v-mo…

中秋节如何利用Python发送彩信

中秋节&#xff0c;作为中国传统节日之一&#xff0c;不仅是家人团聚的时刻&#xff0c;也是商家提高销售业绩的黄金时期。在这个充满温情与消费氛围的节日里&#xff0c;合理利用短信平台进行精准营销&#xff0c;可以显著提高企业的销售业绩。 支持免费对接试用乐讯通PaaS平台…