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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 为了解决高并发下,服务的可用,缓存,降级,限流。

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


 那么我们来看看限流。最简单的限流方式,就是这个接口只处理一定的个数的请求,比如只处理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 来请求下,


image.png


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


image.png


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


image.png


这样来说 相当于一共就是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


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


image.png


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


image.png


image.png


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


image.png


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


image.png


image.png


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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
消息中间件 缓存 监控
直呼内行!阿里大佬离职带出内网专属“高并发系统设计”学习笔记
我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。
|
消息中间件 缓存 监控
直呼内行!阿里大佬离职带出内网专属“高并发系统设计”学习笔记
我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。
|
SQL 缓存 NoSQL
课时4: Spring Boot2.5实战高并发缓存 Redis 与安全机制|学习笔记(三)
快速学习课时4: Spring Boot2.5实战高并发缓存 Redis 与安全机制
课时4: Spring Boot2.5实战高并发缓存 Redis 与安全机制|学习笔记(三)
|
存储 缓存 NoSQL
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
快速学习 Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
|
SQL 监控 AliSQL
MySQL 高并发场景实战|学习笔记(二)
快速学习 MySQL 高并发场景实战
MySQL 高并发场景实战|学习笔记(二)
|
SQL 缓存 运维
MySQL 高并发场景实战|学习笔记(一)
快速学习 MySQL 高并发场景实战
MySQL 高并发场景实战|学习笔记(一)
|
SQL 缓存 监控
MySQL 高并发场景实战|学习笔记
快速学习 MySQL 高并发场景实战。
283 0
MySQL 高并发场景实战|学习笔记
|
消息中间件 存储 缓存
Redis 的高并发实战:抢购系统 | 学习笔记
快速学习 Redis 的高并发实战:抢购系统
Redis 的高并发实战:抢购系统 | 学习笔记
|
中间件 Java 应用服务中间件
高并发带来的问题|学习笔记
快速学习高并发带来的问题
高并发带来的问题|学习笔记
|
缓存 NoSQL 算法
高并发分布式缓存 Redis6.0(二)|学习笔记
快速学习高并发分布式缓存 Redis6.0(二)