目錄
1:如何實現(xiàn)分布式限流
2:限流的幾種類別?
2.1:固定窗口限流
2.2:滑動窗口限流
2.3:漏桶限流
2.4:令牌桶限流
3:實現(xiàn)分布式限流:Redis
3.1:引入Redisson的依賴包
3.2:初始化Redisson
3.3:創(chuàng)建Redisson的限流類?
1:如何實現(xiàn)分布式限流
1:把統(tǒng)計用戶的使用頻率等這些數(shù)據(jù)放到一個集中的存儲,比如redis,這樣無論用戶的請求落在了哪臺服務器,都以集中存儲的數(shù)據(jù)為準。(Redis)
2:限流的幾種類別?
2.1:固定窗口限流
單位時間內(nèi),允許部分操作。 1小時,只允許10個用戶操作。
優(yōu)點:最簡單
缺點:可能出現(xiàn)流量突刺
eg:前59分鐘,第59分鐘來了十個操作。第一小時01分鐘又來了十個操作,就可能導致流量突刺,相當于2分鐘實現(xiàn)了20個操作。
2.2:滑動窗口限流
單位時間內(nèi),允許部分操作,但是這個時間是滑動的? 需要指定滑動單位
滑動單位: 1min
開始前:
0s? 1h 2h
一分鐘:
1min 1h1min
優(yōu)點;能夠解決上面流量突刺的問題,第59分鐘,限流窗口59min到1h59min,這個時間段內(nèi)接受10次請求,只要在這個窗口內(nèi),更多的操作就會被拒絕。
缺點:實現(xiàn)相對復雜。滑動單位越小,限效果越好。
2.3:漏桶限流
以固定的速率請求,當請求桶滿后,拒絕請求。
每秒處理10個請求,桶的容量是10,每0.1秒處理1次請求(固定的),如果1秒內(nèi),來了10個都可以處理完,但如果一秒內(nèi)來了11個請求,最后那個請求就會被拒絕。
優(yōu)點:能夠一定程度上應對流量突刺,能夠以固定的速率處理請求,安全性高
缺點:速度是固定的,沒有辦法處理一批請求,只能一個一個來
2.4:令牌桶限流
管理員先生成一批令牌,每秒生成10個令牌,當用戶操作前,先去拿到令牌,有令牌的人可以先執(zhí)行,都能夠同時執(zhí)行。
優(yōu)點:能夠并發(fā)處理同時的請求,并發(fā)性高
缺點:時間單位選取的問題。
?以上漏桶限流和令牌桶限流最常用。
3:實現(xiàn)分布式限流:Redis
3.1:引入Redisson的依賴包
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.5</version>
</dependency>
3.2:初始化Redisson
@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:創(chuàng)建Redisson的限流類?
@Service
public class RedisLimiterManage {
@Autowired
private RedissonClient redissonClient;
//key:區(qū)分不同的限流器:不同的用戶id
public void doRateLimit(String key){
RRateLimiter rateLimiter=redissonClient.getRateLimiter(key);
//將所有用戶的訪問次數(shù)放在同一個限流器上,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調(diào)用doRateLimit方法,就可以進行分布式限流的操作。文章來源:http://www.zghlxwxcb.cn/news/detail-720497.html
@Autowired
private RedisLimiterManage redisLimiterManage;
//引入依賴
//進行限流判斷
redisLimiterManage.doRateLimit("genChartByAi_"+user.getId());
//每個用戶的限流器
?文章來源地址http://www.zghlxwxcb.cn/news/detail-720497.html
到了這里,關于分布式限流:Redis的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!