返回顶部
首页 > 资讯 > 精选 >Redis+AOP怎么自定义注解实现限流
  • 925
分享到

Redis+AOP怎么自定义注解实现限流

2023-07-02 13:07:44 925人浏览 薄情痞子
摘要

今天小编给大家分享一下Redis+aop怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。下载1,下载页面

今天小编给大家分享一下Redis+aop怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

下载

1,下载页面

2,下载

解压

tar -xzvf Redis-5.0.7.tar.gz

准备编译

1, 请在操作前确认GCc是否已安装,gcc -v

如未安装,可以执行这个命令安装:yum install gcc

2,请在操作前确认tcl是否已安装如未安装,可以执行这个命令安装:yum install tcl

编译

[root@localhost source]# cd redis-5.0.7/[root@localhost redis-5.0.7]# make MALLOC=libc

make 后加 MALLOC的参数的原因:

避免提示找不到 jemalloc/jemalloc.h

测试编译

[root@localhost redis-5.0.7]# make test

如果看到以下字样:表示无错误:\o/ All tests passed without errors!

安装

[root@localhost redis-5.0.7]# mkdir /usr/local/soft/redis5 可分步创建[root@localhost redis-5.0.7]# cd /usr/local/soft/redis5/[root@localhost redis5]# mkdir bin[root@localhost redis5]# mkdir conf[root@localhost redis5]# cd bin/

find / -name redis-cli 查找文件位置

[root@localhost bin]# cp /root/redis-5.0.7/src/redis-cli ./[root@localhost bin]# cp /root/redis-5.0.7/src/redis-server ./[root@localhost bin]# cd …/conf/[root@localhost conf]# cp /root/redis-5.0.7/redis.conf ./

配置

[root@localhost conf]# vi redis.conf

设置以下两个地方:

# daemonize no  daemonize yes  # maxmemory <bytes>maxmemory 128MB

说明:分别是以daemon方式独立运行 / 内存的最大使用限制

运行

[root@localhost conf]# /usr/local/soft/redis5/bin/redis-server /usr/local/soft/redis5/conf/redis.conf

检查端口是否在使用中

[root@localhost conf]# netstat -anp | grep 6379tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 16073/redis-server

查看redis的当前版本:

[root@localhost conf]# /usr/local/soft/redis5/bin/redis-server -vRedis server v=5.0.7 sha=00000000:0 malloc=libc bits=64 build=8e31d2ed9a4c9593

使redis可以用systemd方式启动和管理

1,编辑service文件

[root@localhost liuhongdi]# vim /lib/systemd/system/redis.service

2,service文件内容:

[Unit]Description=RedisAfter=network.target[Service]Type=forkingPIDFile=/var/run/redis_6379.pidExecStart=/usr/local/soft/redis5/bin/redis-server /usr/local/soft/redis5/conf/redis.confExecReload=/bin/kill -s HUP $MaiNPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target

重载系统服务

[root@localhost liuhongdi]# systemctl daemon-reload

4,用来管理redis

启动

systemctl start redis

查看状态

systemctl status redis

使开机启动

systemctl enable redis

查看本地Centos的版本:

[root@localhost lib]# cat /etc/redhat-releaseCentOS linux release 8.1.1911 (Core)

客户端连接redis

阿里云得设置redis.conf中的bind 后跟着的127.0.0.1修改为0.0.0.0,重启redis

开放端口:开放服务器的端口号,步骤如下:

打开实例列表,点击“ 更多”按钮,选择“ 网络安全组 ”中的“安全组配置”,选择 “安全组列表”tab页面,点击 “配置规则”按钮,点击 “快速添加”按钮,勾选“Redis(6379)”,点击 “确定”之后就可以正常连接了。

给redis设置连接密码:

查找到# requirepass foobared 注释去掉并写入要设置的密码,例如:requirepass 123456

redis启动之后测试是否可以连接命令

./redis-cli -h 127.0.0.1 -p 6379127.0.0.1:6379> auth 123456//此处是你的密码

注意: 如果是阿里云的话一定要设置密码,否则很可能被矿机程序注入定时任务,用你的服务器挖矿,阿里云一直会有信息提示你。

Redis限流

服务器上的Redis已经安装完成了(安装步骤见上文),今天就让我们使用Redis来做个小功能:自定义拦截器限制访问次数,也就是限流。

首先我们要在项目中引入Redis

1、引入依赖

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- redis依赖commons-pool 这个依赖一定要添加 --><dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-pool2</artifactId></dependency>

2、application.yml配置

server:port: 8181spring:redis:  host: 127.0.0.1  port: 6379  timeout: 10s  lettuce:    pool:    # 连接池中的最小空闲连接 默认0      min-idle: 0      # 连接池中的最大空闲连接 默认8      max-idle: 8      # 连接池最大连接数 默认8 ,负数表示没有限制      max-active: 8      # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1      max-wait: -1ms  #选择哪个库存储,默认是0  database: 0  passWord: 123456

3、创建redisConfig,引入redisTemplate

@Configurationpublic class RedisConfig {   @Bean   public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {       RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();       redisTemplate.seTKEySerializer(new StringRedisSerializer());       redisTemplate.setValueSerializer(new GenericJackson2JSONRedisSerializer());       redisTemplate.setHashKeySerializer(new StringRedisSerializer());       redisTemplate.setHashValueSerializer(new GenericJackson2jsonRedisSerializer());       redisTemplate.setConnectionFactory(redisConnectionFactory);       return redisTemplate;  }}

自定义注解和拦截器

1、自定义注解

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface AccessLimit {   int seconds(); //秒数   int maxCount(); //最大访问次数   boolean needLogin()default true;//是否需要登录}

2、创建拦截器

@Componentpublic class FangshuaInterceptor extends HandlerInterceptorAdapter {   @Autowired   private RedisTemplate redisTemplate;   @Override   public boolean preHandle(httpservletRequest request, HttpServletResponse response, Object handler) throws Exception {       //判断请求是否属于方法的请求       if(handler instanceof HandlerMethod){           HandlerMethod hm = (HandlerMethod) handler;           //获取方法中的注解,看是否有该注解           AccessLimit accessLimit = hm.getMethodAnnotation(AccessLimit.class);           if(accessLimit == null){               return true;          }           int seconds = accessLimit.seconds();           int maxCount = accessLimit.maxCount();           boolean login = accessLimit.needLogin();           String key = request.getRequestURI();           //如果需要登录           if(login){               //获取登录的session进行判断,此处只是例子,不写具体的业务               //.....               key+=""+"1";  //这里假设用户是1,项目中是动态获取的userId          }           //从redis中获取用户访问的次数           Integer count;           if(Objects.isNull(redisTemplate.opsForValue().get(key))){               count = 0;          }else{               count = (Integer) redisTemplate.opsForValue().get(key);          }           if(count == 0){               redisTemplate.opsForValue().set(key,1,seconds, TimeUnit.SECONDS);          }else if(count<maxCount){               //key的值加1               redisTemplate.opsForValue().increment(key);          }else{               //超出访问次数               Map<String,Object> errMap=new HashMap<>();               errMap.put("code",400);               errMap.put("msg","请求超时,请稍后再试");               render(response,errMap); //这里的CodeMsg是一个返回参数               return false;          }      }       return true;  }   private void render(HttpServletResponse response, Map<String,Object> errMap) throws Exception {       response.setContentType("application/json;charset=UTF-8");       OutputStream out = response.getOutputStream();       String str = JSON.toJSONString(errMap);       out.write(str.getBytes("UTF-8"));       out.flush();       out.close();  }}

3、将自定义拦截器加入到拦截器列表中

@Configurationpublic class WEBConfig extends WebmvcConfigurerAdapter {   @Autowired   private FangshuaInterceptor interceptor;   @Override   public void addInterceptors(InterceptorReGIStry registry) {       registry.addInterceptor(interceptor);  }}

最后做一下简单的测试

@RestController@RequestMapping("test")public class TestController {   //每三十秒最多可以请求三次,不需要登录   @AccessLimit(seconds=30, maxCount=3, needLogin=false)   @PostMapping("/fangshua")   public String fangshua(){       return "成功";  }}

以上就是“Redis+AOP怎么自定义注解实现限流”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Redis+AOP怎么自定义注解实现限流

本文链接: https://lsjlt.com/news/342183.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis+AOP怎么自定义注解实现限流
    今天小编给大家分享一下Redis+AOP怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。下载1,下载页面...
    99+
    2023-07-02
  • Redis+AOP+自定义注解实现限流
    目录Redis安装下载解压准备编译编译测试编译安装配置运行检查端口是否在使用中查看redis的当前版本:使redis可以用systemd方式启动和管理查看本地centos的版本:客户端连接redisRedis限流1、引入...
    99+
    2022-06-28
    Redis AOP 自定义注解 限流 Redis 限流
  • SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码
    目录为什么要限流限流背景实现限流1、引入依赖2、自定义限流注解3、限流切面4、写一个简单的接口进行测试5、全局异常拦截6、接口测试为什么要限流 系统在设计的时候,我们会有一个系统的预...
    99+
    2024-04-02
  • AOP Redis自定义注解实现细粒度接口IP访问限制
    目录系列说明实现步骤一、引入依赖二、写注解三、写逻辑(注解环绕)1. 添加注解2. 注入 RedisTemplate3. 定义方法4. 实现方法5. 开启spring自动装配四、测试总结系列说明 github地址:git...
    99+
    2024-04-02
  • AOP Redis自定义注解实现细粒度接口IP访问限制
    目录系列说明实现步骤一、引入依赖二、写注解三、写逻辑(注解环绕)1. 添加注解2. 注入 RedisTemplate3. 定义方法4. 实现方法5. 开启spring自动装配四、测试...
    99+
    2022-11-13
    AOP Redis 接口IP访问限制 AOP Redis
  • SpringBoot搭配AOP实现自定义注解
    目录1.springBoot的依赖2.自定义注解的步骤2.1定义注解类2.2定义切面2.3使用注解3.知识点补充3.1 关于Target注解补充3.2 关于Retention注解补充...
    99+
    2022-12-09
    SpringBoot AOP自定义注解 SpringBoot  自定义注解 SpringBoot AOP 注解
  • Spring AOP 实现自定义注解的示例
    目录1. 注解如下:2. 切面自工作后,除了一些小项目配置事务使用过 AOP,真正自己写 AOP 机会很少,另一方面在工作后还没有写过自定义注解,一直很好奇注解是怎么实现他想要的功能...
    99+
    2024-04-02
  • 使用Spring AOP 如何实现自定义注解
    这期内容当中小编将会给大家带来有关使用Spring AOP 如何实现自定义注解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Maven中加入以下以依赖:<!-- Spring AOP + Aspe...
    99+
    2023-05-31
    springaop 注解
  • SpringBoot如何使用自定义注解实现接口限流
    目录使用自定义注解实现接口限流1、自定义限流注解2、限流类型枚举类3、限流 Lua 脚本4、限流切面处理类 5、使用与测试SpringBoot工程中限流方式1、google...
    99+
    2024-04-02
  • SpringBoot中怎么利用AOP和拦截器实现自定义注解
    本篇内容主要讲解“SpringBoot中怎么利用AOP和拦截器实现自定义注解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot中怎么利用AOP和拦截器实现自定义注解”吧!Spri...
    99+
    2023-07-02
  • springboot使用自定义注解实现aop切面日志
    平时我们在开发过程中,代码出现bug时为了更好的在服务器日志中寻找问题根源,会在接口的首尾打印日志,看下参数和返回值是否有问题。但是手动的logger.info() 去编写时工作量较...
    99+
    2024-04-02
  • SpringBoot自定义注解之实现AOP切面日志详解
    通过自定义注解的方式(如:@SysLog(obj = "操作对象", text = "操作内容"),在 SpringBoot 中来实现 AOP...
    99+
    2024-04-02
  • Java怎么实现自定义注解
    本文小编为大家详细介绍“Java怎么实现自定义注解”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么实现自定义注解”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概念概念:说明程序的。给计算机看的注释:用...
    99+
    2023-07-02
  • SpringBoot中利用AOP和拦截器实现自定义注解
    目录前言Spring实现自定义注解1.引入相关依赖2.相关类Java实现自定义注解通过Cglib实现通过JDk动态代理实现Cglib和JDK动态代理的区别写在最后前言 最近遇到了这样...
    99+
    2024-04-02
  • 怎么使用AOP+redis+lua做限流
    这篇“怎么使用AOP+redis+lua做限流”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用AOP+redis+lu...
    99+
    2023-06-30
  • Java自定义注解@Log和AOP实现用户操作日志
            1、实现前准备,MySQL数据库中创建表 CREATE TABLE `sys_log` ( `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键', `ti...
    99+
    2023-10-03
    java spring boot mysql restful
  • java自定义切面增强方式(关于自定义注解aop)
    目录java自定义切面增强切面、自定义注解的使用AOP简介AOP定义注解简介元素和组成元注解总结java自定义切面增强 写代码时会遇到一些有些重复机械的工作, 这个时候就可以运用切面...
    99+
    2023-05-14
    java自定义切面增强 自定义注解aop java切面
  • 怎么在Java中实现自定义注解
    怎么在Java中实现自定义注解?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解是什么?①、引用自维基百科的内容:Java注解又称Java标注,是JDK5.0版本开始支持加入源...
    99+
    2023-06-14
  • Java自定义注解实现Redis自动缓存的方法
    在实际开发中,可能经常会有这样的需要:从MySQL中查询一条数据(比如用户信息),此时需要将用户信息保存至Redis。刚开始我们可能会在查询的业务逻辑之后再写一段Redis相关操作的代码,时间长了后发现这部分代码实际上仅仅做了Redis的写...
    99+
    2023-05-31
    java redis ava
  • Redis限流怎么实现
    这篇文章给大家分享的是有关Redis限流怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。面对越来越多的高并发场景,限流显示的尤为重要。当然,限流有许多种实现的方式,Redi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作