基于Redis的令牌桶算法
令牌桶算法提及到輸入速率和輸出速率,當輸出速率大于輸入速率,那么就是超出流量限制了。
也就是說我們每訪問一次請求的時候,可以從Redis中獲取一個令牌,如果拿到令牌了,那就說明沒超出限制,而如果拿不到,則結果相反。
依靠上述的思想,我們可以結合Redis的List數據結構很輕易的做到這樣的代碼,只是簡單實現(xiàn)
依靠List的leftPop來獲取令牌
// 輸出令牌
public Response limitFlow2(Long id){
Object result = redisTemplate.opsForList().leftPop("limit_list");
if(result == null){
return Response.ok("當前令牌桶中無令牌");
}
return Response.ok(articleDescription2);
}
再依靠Java的定時任務,定時往List中rightPush令牌,當然令牌也需要唯一性,所以我這里還是用UUID進行了生成
// 10S的速率往令牌桶中添加UUID,只為保證唯一性
@Scheduled(fixedDelay = 10_000,initialDelay = 0)
public void setIntervalTimeTask(){
redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
}
綜上,代碼實現(xiàn)起始都不是很難,針對這些限流方式我們可以在AOP或者filter中加入以上代碼,用來做到接口的限流,最終保護你的網站。