分布式限流: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的依赖包

XML 复制代码
  <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.17.5</version>
   </dependency>

3.2:初始化Redisson

java 复制代码
@Configuration
@ConfigurationProperties(prefix = "spring.redis")

public class RedissonConfig {
    private Integer database;
    private String host;
    private String port;
    @Bean
    public RedissonClient getRedissonClient(){
        //配置Redis的配置类
        Config config=new Config();
        config.useSingleServer()
                .setDatabase(database)
                .setAddress("redis://"+host+":"+port);
        RedissonClient redisson= Redisson.create(config);
        return redisson;

    }
}

3.3:创建Redisson的限流类

java 复制代码
@Service
public class RedisLimiterManage {
    @Autowired
    private RedissonClient redissonClient;
    //key:区分不同的限流器:不同的用户id
    public void doRateLimit(String key){

        RRateLimiter rateLimiter=redissonClient.getRateLimiter(key);
        //将所有用户的访问次数放在同一个限流器上,1秒允许两次
        rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
        //每当一个用户来了之后,请求一个令牌
        boolean result = rateLimiter.tryAcquire(1);
        if(!result){
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR,"请求过于频繁");
        }
    }
}

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

java 复制代码
 @Autowired
 private RedisLimiterManage redisLimiterManage;
//引入依赖

 //进行限流判断
        redisLimiterManage.doRateLimit("genChartByAi_"+user.getId());
 //每个用户的限流器
相关推荐
没差c1 小时前
springboot集成flyway
java·spring boot·后端
三水不滴1 小时前
Redis 过期删除与内存淘汰机制
数据库·经验分享·redis·笔记·后端·缓存
编程彩机1 小时前
互联网大厂Java面试:从Java SE到大数据场景的技术深度解析
java·大数据·spring boot·面试·spark·java se·互联网大厂
像少年啦飞驰点、3 小时前
零基础入门 Spring Boot:从“Hello World”到可上线微服务的完整学习指南
java·spring boot·微服务·编程入门·后端开发
indexsunny4 小时前
互联网大厂Java面试实战:从Spring Boot到微服务架构的技术问答解析
java·spring boot·redis·微服务·kafka·jwt·flyway
sheji34164 小时前
【开题答辩全过程】以 基于SpringBoot的疗养院管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
像少年啦飞驰点、5 小时前
零基础入门 Spring Boot:从‘Hello World’到可上线微服务的完整学习路径
java·spring boot·web开发·编程入门·后端开发
麦兜*5 小时前
深入解析现代分布式事务架构:基于Seata Saga模式与TCC模式实现金融级高可用与数据最终一致性的工程实践全解析
分布式·金融·架构
ytgytg285 小时前
HC小区管理系统安装,提示redis连接错误
数据库·redis·缓存