Re‌disson分布式限流的基础使用

1、引入Redisson依赖

java
复制代码
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.21.3</version> </dependency>

2、创建Re‌dissonConfig

注意点

2.1 建议专门为redisson准备一个数据库

​ @ConfigurationProperties(prefix = "spring.redisson")

java
复制代码
// config/RedissonConfig package com.zxw.bi_intelligence.config; import lombok.Data; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration // 从application.yml文件中读取前缀为"spring.redis"的配置项 @ConfigurationProperties(prefix = "spring.redisson") @Data public class RedissonConfig { private Integer database; private String host; private Integer port; // 如果redis默认没有密码,则不用写 //private String password; // spring启动时,会自动创建一个RedissonClient对象 @Bean public RedissonClient getRedissonClient() { // 1.创建配置对象 Config config = new Config(); // 添加单机Redisson配置 config.useSingleServer() // 设置数据库 .setDatabase(database) // 设置redis的地址 .setAddress("redis://" + host + ":" + port); // 设置redis的密码(redis有密码才设置) // .setPassword(password); // 2.创建Redisson实例 RedissonClient redisson = Redisson.create(config); return redisson; } }

3、创建RedisLimiterManager

java
复制代码
// manager/RedisLimiterManager package com.zxw.bi_intelligence.manager; import com.zxw.bi_intelligence.common.ErrorCode; import com.zxw.bi_intelligence.exception.BusinessException; import org.redisson.api.RRateLimiter; import org.redisson.api.RateIntervalUnit; import org.redisson.api.RateType; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * 专门提供 RedisLimiter 限流基础服务的(提供了通用的能力,放其他项目都能用) */ @Service public class RedisLimiterManager { @Resource private RedissonClient redissonClient; /** * 限流操作 * * @param key 区分不同的限流器,比如不同的用户 id 应该分别统计 */ public void doRateLimit(String key) { // 创建一个名称为user_limiter的限流器,每秒最多访问 2 次 RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); // 限流器的统计规则(每秒2个请求;连续的请求,最多只能有1个请求被允许通过) // RateType.OVERALL表示速率限制作用于整个令牌桶,即限制所有请求的速率 /** * Updates RateLimiter's state and stores config to Redis server. * @param mode - rate mode * @param rate - rate * @param rateInterval - rate time interval * @param rateIntervalUnit - rate time interval unit */ rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS); // 每当一个操作来了后,请求一个令牌,可以在这里设置比如vip用户可以多请求几个令牌 boolean canOp = rateLimiter.tryAcquire(1); // 如果没有令牌,还想执行操作,就抛出异常 if (!canOp) { throw new BusinessException(ErrorCode.TOO_MUCH_REQUESTS); } } }

3.1 根据key控制限流

根据用户限流: key = userId

根据接口限流: key = genChartData (接口名)

两者结合限流: key = genChartData_userId (每个用户使用这个接口流量)

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友4537
下载 APP