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 29✅ 今天做了:Redis消息队列⏰ 明天计划:继续学消息队列
2
Day 17🧭行动:学习了Python最后一个知识点:异常处理🤓体会:Python 程序一旦发生异常,如果没有捕获处理,程序就会直接崩溃终止。使用"try-except"捕获异常,可以预先写好异常处理方案:比如打印友好提示、记录日志、释放资源,保证程序不会直接退出,还能继续运行。🧑💻代码:try:print("================================")# pri
2
Day1今天学习了java中if的使用
2
day 61今天来学校上课了,和教授谈了,可以接下RA工作,不过一周只能charge 10h, 工资很少,不过一个月600刀也勉强比没有好。今天的工作还没做完,最近在做知识库构造,Ui/UX上周就设计完,现在在做底座的建设今天也让Claude直接帮我把Neetcode150 题目+解题思路+代码给我整理了,我发现我真的只有找碎片化时间才能做题,我还不如先背先回忆(之前都做过)祝祖国母亲节日快乐,也
2
Day 1✅ 今天做了:⏰ 明天计划:📚 今日感悟:
0
