Redisson分布式限流的基础使用
1、引入Redisson依赖
▼java复制代码<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.21.3</version> </dependency>
2、创建RedissonConfig
注意点
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个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
Day 68时间19:00~ 22:00(3h)✅ 今天做了:Component注解、Mybatis配置、使用⏰ 明天计划:Lombok、Mapper映射、动态SQL📚 今日感悟:自动配置类DataSourceAutoConfiguration ,会读取properties文件,通过注解:@EnableConfigurationProperties(DataSourceProperties.cl
2
Day 19✅ 今天做了:MCP⏰ 明天计划:AI智能体构建📚 今日感悟:今天MCP问题有点多有点杂,明天找时间再捋一下。继续加油
1
Day 25✅ 今天做了:1、扇贝英语单词打卡2、英语听说读写、听力练习3、微信阅读15分钟4、编程导航学习⏰ 明天计划:待定📚 今日感悟:Keep going!
2
Day 104✅ 今天做了:学习了Java反射及快速入门⏰ 明天计划:继续学习Java反射
1
为啥codex老是提示这个啊
1
