SpringBoot整合Redis并且用Redis实现限流的方法 附Redis解压包

 更新时间:2024年06月28日 15:21:22   作者:熊哈哈O_o  
这篇文章主要介绍了SpringBoot整合Redis并且用Redis实现限流的方法 附Redis解压包,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

本文介绍SpringBoot整合Redis并且进行接口的限流,文章主要介绍的是一种思想,具体代码还要结合实际。

一、Windows安装Redis

Redis的解压包我放在了百度网盘上,有需要的可以下载。

Redis-x64-3.0.504

百度网盘下载:

链接: https://pan.baidu.com/s/1hUSgEVjuTtfGyiBe4mmBXQ?pwd=tqrj 提取码: tqrj

二、启动Redis

我们在本地解压下载的Redis压缩包,打开解压后的目录,首先启动redis-server.exe,之后在启动redis-cli.exe。

启动成功截图如下。

三、SpringBoot整合Redis 

1.引入依赖 

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2.添加配置文件application.yml

 我们并没有设置密码所以不用配置。

spring: 
  redis:
    host: 127.0.0.1
    port: 6379

3.创建RedisController

我们现在是介绍思想,所以传入了一个用户的id来判断是哪一个用户访问的接口。我们对redis中保存的key为用户id的键值对进行一个自增操作,然后返回这个自增后的值,这个值代表的就是我们在十秒钟内访问接口的次数。每次访问我们都重新设置这个键值对的有效时间,如果值大于5说明我们访问的次数已经达到了系统对个人十秒钟内访问次数的限制了,就不可以执行我们的业务逻辑。

@Resource
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/test2")
    public String test2(String id){
        Long increment = redisTemplate.opsForValue().increment(id);
        redisTemplate.expire(id,10,TimeUnit.SECONDS);
        if(increment > 5){
            return "不可以访问,访问次数为"+increment;
        }
        return "可以访问,访问次数为"+increment;
    }

之后启动我们的SpringBoot项目。我这里使用的是PostMan进行的接口测试。

进行第一次访问。

第二次。

第五次 。

第六次。第六次可以看到接口的返回值为不可以访问,说明我们的访问次数已经上限了,这时候就要等十秒后再次访问了。

四、Redis限流的几种方法 

1.基于Redis的数据结构zset(滑动窗口)

思想比较容易接收,我们定一个这样一个key为limit的列表,每当我们发送一次请求的时候,我们向这个列表当中添加当前的时间戳(前提是没有被限流),当然,在我们进行数据的添加之前需要进行是否需要进行限流。我们设定intervalTime为限流的时间间隔,我们从limit列表中获取我们访问接口的时间currentTIme-intervalTime,这样我们判断一下(currentTIme-intervalTime,currentTime)范围内的时间戳个数,也就是我们请求的次数,这样就能判断是否超过限制了。这里我用一张图来表示。

既然叫做滑动窗口,那这个窗口的大小就是我们进行限流的时间间隔,这个窗口在我们的时间轴上进行移动。

代码如下:

@GetMapping("/test3")
    public String test3(){
        int intervalTime = 10;
        Long currentTime = new Date().getTime();
        if(Boolean.TRUE.equals(redisTemplate.hasKey("limit"))) {
            Integer count = Objects.requireNonNull(redisTemplate.opsForZSet().rangeByScore("limit", currentTime - intervalTime, currentTime)).size();
            if (count != null && count > 5) {
                return "每分钟最多只能访问5次";
            }
        }
        redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(),currentTime);
        return "访问成功";
    }

 2.基于Redis的令牌桶算法

这个就好理解了,一个筐子里十个苹果大家都去拿,拿到了就可以吃,拿不到就等着别人放。在Redis里我们在一个列表里放令牌,用户访问接口去尝试拿这个令牌,拿到了就能访问接口,拿不到就进行限流,当然除了拿令牌之外还放令牌,我们通过定时任务向列表内放令牌。

 @GetMapping("/test3")
    public String test3(){
        Object result = redisTemplate.opsForList().leftPop("limit_list");
        if(result == null){
            return "当前令牌桶中无令牌,无法访问";
        }
        return "访问成功";
    }
    @Scheduled(fixedDelay = 100,initialDelay = 0)
    public void setLimitListTask(){
        redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
    }

定时任务到底如何使用,大家可以自行搜索一下。还有一些其他的方式本文就不在介绍了。

到此这篇关于SpringBoot整合Redis并且用Redis实现限流的方法 附Redis解压包的文章就介绍到这了,更多相关SpringBoot Redis限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 通过mave命令下载jar包的示例代码

    Java 通过mave命令下载jar包的示例代码

    这篇文章主要介绍了Java 通过mave命令下载jar的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringMVC的Body参数拦截的问题

    SpringMVC的Body参数拦截的问题

    SpringMVC对出参和入参有非常友好的拓展支持,方便你对数据的输入和输出有更大的执行权,我们如何通过SpringMVC定义的结果做一系列处理呢,需要的朋友可以参考下
    2018-06-06
  • java实现ReadWriteLock读写锁的示例

    java实现ReadWriteLock读写锁的示例

    ReadWriteLock是Java并发包中的接口,定义了读锁和写锁,读锁允许多线程同时访问共享资源,而写锁则要求独占,这种机制适用于读多写少的场景,可以提高并发效率同时保证数据一致性,本文就来详细的介绍一下如何实现,感兴趣的可以了解一下
    2024-09-09
  • java中字符串常见的方法及总结

    java中字符串常见的方法及总结

    这篇文章主要介绍了java中字符串常见的方法及总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 实战分布式医疗挂号通用模块统一返回结果异常日志处理

    实战分布式医疗挂号通用模块统一返回结果异常日志处理

    这篇文章主要为大家介绍了实战分布式医疗挂号系统之统一返回结果统一异常处理,统一日志处理到通用模块示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-04-04
  • java 环境配置(2023年详细教程)

    java 环境配置(2023年详细教程)

    这篇文章首先为了完善我的知识体系,今后一些软件的安装教程也可能会用到想写一个更加详细的,因为这并不仅仅是写给 IT 行业的,其它行业可能也需要配置java环境
    2023-06-06
  • Springboot启动流程详细分析

    Springboot启动流程详细分析

    这篇文章主要介绍了SpringBoot启动过程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • 详解MyBatis多数据源配置(读写分离)

    详解MyBatis多数据源配置(读写分离)

    这篇文章主要介绍了详解MyBatis多数据源配置(读写分离),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Java软件设计模式之桥接模式详解

    Java软件设计模式之桥接模式详解

    这篇文章主要介绍了Java软件设计模式之桥接模式详解,桥接模式也叫做桥梁模式,结构型设计模式的一种,顾名思义,就是用来连接两个部分,为被分离了的抽象部分和实现部分搭桥,需要的朋友可以参考下
    2023-07-07
  • java HttpURLConnection类的disconnect方法与http长连接详解

    java HttpURLConnection类的disconnect方法与http长连接详解

    这篇文章主要介绍了java HttpURLConnection类的disconnect方法与http长连接,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04

最新评论