iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/342183.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Redis+AOP怎么自定义注解实现限流
    今天小编给大家分享一下Redis+AOP怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。下载1,下载页面...
    99+
    2023-07-02
  • SpringBoot使用自定义注解+AOP+Redis实现接口限流的实例代码
    目录为什么要限流限流背景实现限流1、引入依赖2、自定义限流注解3、限流切面4、写一个简单的接口进行测试5、全局异常拦截6、接口测试为什么要限流 系统在设计的时候,我们会有一个系统的预...
    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自定义注解实现Redis自动缓存的方法
    在实际开发中,可能经常会有这样的需要:从MySQL中查询一条数据(比如用户信息),此时需要将用户信息保存至Redis。刚开始我们可能会在查询的业务逻辑之后再写一段Redis相关操作的代码,时间长了后发现这部分代码实际上仅仅做了Redis的写...
    99+
    2023-05-31
    java redis ava
  • java自定义切面增强方式(关于自定义注解aop)
    目录java自定义切面增强切面、自定义注解的使用AOP简介AOP定义注解简介元素和组成元注解总结java自定义切面增强 写代码时会遇到一些有些重复机械的工作, 这个时候就可以运用切面...
    99+
    2023-05-14
    java自定义切面增强 自定义注解aop java切面
  • 怎么在Java中实现自定义注解
    怎么在Java中实现自定义注解?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。注解是什么?①、引用自维基百科的内容:Java注解又称Java标注,是JDK5.0版本开始支持加入源...
    99+
    2023-06-14
  • Redis限流怎么实现
    这篇文章给大家分享的是有关Redis限流怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。面对越来越多的高并发场景,限流显示的尤为重要。当然,限流有许多种实现的方式,Redi...
    99+
    2024-04-02
  • 使用AOP+redis+lua做方法限流的实现
    目录需求实现方式源码Limit 注解LimitKeyLimitTypeRedisLimiterHelperLimitInterceptorTestService需求 公司里使用One...
    99+
    2024-04-02
  • Spring AOP实现复杂的日志记录操作(自定义注解)
    目录Spring AOP复杂的日志记录(自定义注解)第一步第二步第三步第四步多个注解可以合并成一个,包括自定义注解比如说SpringMVC的注解Spring AOP复杂的日志记录(自...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作