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

今天分享文章“Redis+AOP怎么自定义注解实现限流”,主要从:下载、解压、准备编译、编译等几个方面为大家介绍,希望能帮到您。

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

3.重载系统服务

[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

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

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

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

3、给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怎么自定义注解实现限流”的介绍已经结束,如果您还想获取更多相关知识,可以继续关注Worktile网站,我们将定期为大家更新一些优质内容。

文章标题:Redis+AOP怎么自定义注解实现限流,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/15129

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年6月29日 上午3:37
下一篇 2022年6月29日 下午11:48

相关推荐

  • linux中的shell有没有系统函数

    今天分享文章“linux中的shell有没有系统函数”,主要从:1. 系统函数、2. 自定义函数等几个方面为大家介绍,希望能帮到您。 linux中的shell有系统函数;shell编程和其他编程语言一样有系统函数,同时也可以自定义函数,例如可以利用basename系统函数来获取文件名,语法为“bas…

    2022年6月29日
    900
  • 为什么好的领导能给你安全感?

    观点源自TED演讲 :《西蒙西·内克: 为什么好的领导能给你安全感?》 管理理论学家西蒙西·内克在TED曾分享过一个观点:好的领导应该让他的员工有安全感和信任感,和他/她一起工作让员工能感到进入了生活“安全区”。 但是创造信任与安全,尤其是在不平等的经济环境中,意味着要承担巨大的责任。 西蒙西·内克…

    2022年3月20日
    18300
  • git如何解决合并冲突

    本篇文章“git如何解决合并冲突”主要为您从以下几个方面讲解:原因、解决方法、git冲突、解决冲突,希望对您有所启发。 git解决合并冲突的方法:1、编辑有冲突的文件,并删除文件中的特殊符号,根据需求修改代码;2、将指定文件添加到暂存区,并将指定的分支提交到主干,执行提交即可,其中使用“git co…

    2022年6月29日
    5600
  • 疫情期间,HR团队是如何实行远程办公的?

    2020年的春节是个不平常的春节,新型冠状病毒突如其来,为了控制病毒传播,国务院办公厅宣布延长2020年春节假期至2月2日,各地政府也相继出台了延期开工政策。 Worktile积极响应国家政策,保障每位员工的身体健康,决定全体员工先在家远程办公。为了战胜疫情,实现真正有效率有成果的远程办公,公司HR…

    2022年3月20日
    10700
  • 知识管理对企业发展重要吗

    企业的每一项业务工作都与知识管理有关系,或者在创造知识,或者在使用知识。因此,建立完整的知识管理体系成为企业获得持续竞争优势是企业发展的重要目标。知识管理成为企业在新形式下战略管理的重要内容,知识经济催生了知识管理,而唯有以知识管理来迎接知识经济,才能应对知识经济所带来的挑战。 1、知识管理是网路新…

    2022年3月18日
    8400
  • vue组件值变化但不刷新问题怎么解决

    今天分享文章“vue组件值变化但不刷新问题怎么解决”,主要从:组件值变化但不刷新强制组件刷新、bug复现、解决等几个方面为大家介绍,希望能帮到您。 组件值变化但不刷新强制组件刷新 在调用组件的时候,如果数据中只是某个属性变化(比如id)变化,在vue开发工具中看到变量值变化,但是组件上的数据就是不刷…

    2022年6月29日
    11800
  • Android开发怎么自定义实时图表控件

    今天分享文章“Android开发怎么自定义实时图表控件”,主要从:演示、环境、实现、第十一步:绘制等几个方面为大家介绍,希望能帮到您。 演示 环境 开发工具:Android Studio 开发语言:Kotlin 实现 第一步:新建项目RealTimeChartDemo 第二步:新建RealTimeC…

    2022年6月29日
    800
  • 多项目管理方法有哪些

    多项目管理方法主要有:1.阶段化管理;2.量化管理;3.优化管理这三个方面。项目管理方法是关于如何进行项目管理的方法,是可在大部分项目中应用的方法。 一、阶段管理 阶段化管理指的是从立项之初直到系统运行维护的全过程。根据工程项目的特点,我们可将项目管理分为若干个小的阶段。 市场信息 1)市场信息方面…

    2022年3月25日
    10400
  • 知识库是什么

    知识库是关于产品、服务、部门或主题的自助式在线信息库。为了让大家更好的了解知识库是什么这个问题,下面我们将会围绕:1、企业知识库是什么;2、企业为什么需要知识库;3、知识库的好处有哪些;三点进行展开。 知识库中的数据可以来自任何地方。通常,精通相关主题的贡献者会给知识库增加或扩展内容。内容可以是从你…

    2022年3月18日
    8800
  • Mybatisplus中的like查询问题怎么解决

    本篇文章“Mybatisplus中的like查询问题怎么解决”主要为您从以下几个方面讲解:上代码、like的四种用法,希望对您有所启发。 Mybatis plus中like查询问题 又谈到了Mybatis plus了,真的很是痛心疾首,在做模糊查询的时候出现了一个问题,版本还是2.0.8,我觉得大问…

    2022年6月29日
    7400
联系我们
关注微信
关注微信
分享本页
返回顶部