当前位置: 代码网 > it编程>数据库>Redis > 使用Redis实现记录访问次数的三种方案

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

2024年09月06日 Redis 我要评论
0. 前言准备一个controller,用来测试。@restcontroller@requestmapping("test")@tag(name = "测试",description = "测试spr

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记录访问次数的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com