• 分布式限流:Redis


    目录

    1:如何实现分布式限流

    2:限流的几种类别 

    2.1:固定窗口限流

    2.2:滑动窗口限流

    2.3:漏桶限流

    2.4:令牌桶限流

    3:实现分布式限流:Redis

    3.1:引入Redisson的依赖包

    3.2:初始化Redisson

    3.3:创建Redisson的限流类 


    1:如何实现分布式限流

    1:把统计用户的使用频率等这些数据放到一个集中的存储,比如redis,这样无论用户的请求落在了哪台服务器,都以集中存储的数据为准。(Redis)

    2:限流的几种类别 

    2.1:固定窗口限流

    单位时间内,允许部分操作。 1小时,只允许10个用户操作。

    优点:最简单

    缺点:可能出现流量突刺

    eg:前59分钟,第59分钟来了十个操作。第一小时01分钟又来了十个操作,就可能导致流量突刺,相当于2分钟实现了20个操作。

    2.2:滑动窗口限流

    单位时间内,允许部分操作,但是这个时间是滑动的  需要指定滑动单位

    滑动单位: 1min

    开始前:

    0s  1h 2h

    一分钟:

    1min 1h1min

    优点;能够解决上面流量突刺的问题,第59分钟,限流窗口59min到1h59min,这个时间段内接受10次请求,只要在这个窗口内,更多的操作就会被拒绝。

    缺点:实现相对复杂。滑动单位越小,限效果越好。

    2.3:漏桶限流

    以固定的速率请求,当请求桶满后,拒绝请求。

    每秒处理10个请求,桶的容量是10,每0.1秒处理1次请求(固定的),如果1秒内,来了10个都可以处理完,但如果一秒内来了11个请求,最后那个请求就会被拒绝。

    优点:能够一定程度上应对流量突刺,能够以固定的速率处理请求,安全性高

    缺点:速度是固定的,没有办法处理一批请求,只能一个一个来

    2.4:令牌桶限流

    管理员先生成一批令牌,每秒生成10个令牌,当用户操作前,先去拿到令牌,有令牌的人可以先执行,都能够同时执行。

    优点:能够并发处理同时的请求,并发性高

    缺点:时间单位选取的问题。

     以上漏桶限流和令牌桶限流最常用。

    3:实现分布式限流:Redis

    3.1:引入Redisson的依赖包

    1. <dependency>
    2. <groupId>org.redissongroupId>
    3. <artifactId>redissonartifactId>
    4. <version>3.17.5version>
    5. dependency>

    3.2:初始化Redisson

    1. @Configuration
    2. @ConfigurationProperties(prefix = "spring.redis")
    3. public class RedissonConfig {
    4. private Integer database;
    5. private String host;
    6. private String port;
    7. @Bean
    8. public RedissonClient getRedissonClient(){
    9. //配置Redis的配置类
    10. Config config=new Config();
    11. config.useSingleServer()
    12. .setDatabase(database)
    13. .setAddress("redis://"+host+":"+port);
    14. RedissonClient redisson= Redisson.create(config);
    15. return redisson;
    16. }
    17. }

     

    3.3:创建Redisson的限流类 

    1. @Service
    2. public class RedisLimiterManage {
    3. @Autowired
    4. private RedissonClient redissonClient;
    5. //key:区分不同的限流器:不同的用户id
    6. public void doRateLimit(String key){
    7. RRateLimiter rateLimiter=redissonClient.getRateLimiter(key);
    8. //将所有用户的访问次数放在同一个限流器上,1秒允许两次
    9. rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
    10. //每当一个用户来了之后,请求一个令牌
    11. boolean result = rateLimiter.tryAcquire(1);
    12. if(!result){
    13. throw new BusinessException(ErrorCode.NO_AUTH_ERROR,"请求过于频繁");
    14. }
    15. }
    16. }

    当我们使用分布式限流Redis的时候,只需要让这个RedisLimiterManage调用doRateLimit方法,就可以进行分布式限流的操作。

    1. @Autowired
    2. private RedisLimiterManage redisLimiterManage;
    3. //引入依赖
    4. //进行限流判断
    5. redisLimiterManage.doRateLimit("genChartByAi_"+user.getId());
    6. //每个用户的限流器

     

  • 相关阅读:
    How to install oracle19c in Centos8
    java如何播放音乐(直接调用)
    HTTP协议再邂逅:HTTP协议结构和通讯原理
    oracle11g体系结构
    河流动力学总结
    百分点科技|怎样做数据运营,才能让数据中台真正用起来?
    Etcd 学习 安装教程
    Windows 有趣功能集锦
    IntelliJ IDEA 2023.1 版本可以安装了
    一文总结 C++ 常量表达式、constexpr 和 const
  • 原文地址:https://blog.csdn.net/weixin_65492194/article/details/134020703