我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用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 进行测试,测试结果。

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

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

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

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) 测试

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

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
    @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中没有任何数据。

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

在浏览器地址栏(或其他工具)输入localhost:8080/test/getInfo/1,进行测试。

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

控制台输出。

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

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

再次查看redis中的数据,发现多了键值,也记录了访问数据。

以上就是使用Redis实现记录访问次数的三种方案的详细内容,更多关于Redis记录访问次数的资料请关注编程网(www.lsjlt.com)其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

目录0. 前言1. 使用Filter实现2. 使用AOP实现1. 导入依赖2. 写一个切面类,实现统计访问次数。3. 开启AOP5. plus版本3. 使用springMVC拦截器实现1. 配置拦截器2. 定义拦截器3. 控制器类4. 测试
使用Redis实现记录访问次数的三种方案
2024-09-06

编程热搜

目录