• 高并发下限流(学习笔记)


      为了解决高并发下,服务的可用,缓存,降级,限流。

      那么我们来看看限流。最简单的限流方式,就是这个接口只处理一定的个数的请求,比如只处理10个请求,那么直接就可以算出,计数限流方式。

      创建spring  boot 应用。

      

    <dependencies>
           
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.0</version>
            </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>
        </dependencies>
    

      计算器实现的方式

    @RestController
    public class OrderController {
        static  long limit=10;
        private long count = 0;
        @GetMapping("/makeorder")
        public Result makeOrder(){
            long c = ++count;
            if(c > limit){
    
                Result result=new Result(false,"抢购结束");
                return result;
            }
            return new Result(true,"成功");
        }
    
    }

    我们可以用jmeter 来请求下,

     只处理10个请求,那么多余10个的请求,就应该返回false

     我们可以看到前几个是成功,最后一个是失败。

     这样来说 相当于一共就是10个请求,不管是那个ip 来请求,一共就接受来10个,这样的问题也会出现的。在分布式部署的情况下,计数是单独的,我们要共享这个计数,我们选择redis ,因为redis 是单线程的。

    支持缓存过期,支持数值自增减
    支持lua脚本,单线程处理缓存业务

     那么我门来看下代码怎么实现,增加需要的依赖包

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

    代码开发如下

    @Autowired
        private RedisTemplate redisTemplate;
        static long limit = 10;
        @GetMapping("/makeorder2")
        public Result makeOrder(){
            long c = redisTemplate.opsForValue().increment("lishi");
                if(c > limit){
                    return new Result(false,"抢购失败");   }
                return    new Result(true,"抢购成功"+c);
          }

    需要配置下redis 相关的内容

     spring: 
           redis:
              host: localhost
              port: 6379
              timeout: 1000
              jedis:
                 pool:
                   max-active: 10
                   max-wait: 2000
                   max-idle: 10
                   min-idle: 5

    我们来测试下,为来方便我们的测试呢,我门在启动来两个服务,

     我们可以用浏览器去请求下

     

     我们在看下redis里面是存储的数据

     那么我们这个时候再去请求下,看是否限可以成功

     

    这样一个简易的限流都已经完成来,限流10个,就完成了。

  • 相关阅读:
    JS中location.search和setTimeout()和 setInterval()
    javascript的AJAX和Serialize(),解码
    php的变量和基本语法
    isnan
    Urllib 库的基础和实用(2)
    urllib 库的基础和实用(1)
    python获取网页精准爬取数据
    eclipse配置
    搭建JAVA WEB开发环境(tomcat)
    JDK环境变量配置
  • 原文地址:https://www.cnblogs.com/leiziv5/p/12714919.html
Copyright © 2020-2023  润新知