Redis 限流的 3 種方式,還有誰(shuí)不會(huì)!
1第一種:基于Redis的setnx的操作
2第二種:基于Redis的數(shù)據(jù)結(jié)構(gòu)zset
public Response limitFlow(){
Long currentTime = new Date().getTime();
System.out.println(currentTime);
if(redisTemplate.hasKey("limit")) {
Integer count = redisTemplate.opsForZSet().rangeByScore("limit", currentTime - intervalTime, currentTime).size(); // intervalTime是限流的時(shí)間
System.out.println(count);
if (count != null && count > 5) {
return Response.ok("每分鐘最多只能訪問(wèn)5次");
}
}
redisTemplate.opsForZSet().add("limit",UUID.randomUUID().toString(),currentTime);
return Response.ok("訪問(wèn)成功");
}
3第三種:基于Redis的令牌桶算法
// 輸出令牌
public Response limitFlow2(Long id){
Object result = redisTemplate.opsForList().leftPop("limit_list");
if(result == null){
return Response.ok("當(dāng)前令牌桶中無(wú)令牌");
}
return Response.ok(articleDescription2);
}
再依靠Java的定時(shí)任務(wù),定時(shí)往List中rightPush令牌,當(dāng)然令牌也需要唯一性,所以我這里還是用UUID進(jìn)行了生成
// 10S的速率往令牌桶中添加UUID,只為保證唯一性
@Scheduled(fixedDelay = 10_000,initialDelay = 0)
public void setIntervalTimeTask(){
redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
}
綜上,代碼實(shí)現(xiàn)起始都不是很難,針對(duì)這些限流方式我們可以在AOP或者filter中加入以上代碼,用來(lái)做到接口的限流,最終保護(hù)你的網(wǎng)站。
有問(wèn)題歡迎留言探討。
3、心態(tài)崩了!稅前2萬(wàn)4,到手1萬(wàn)4,年終獎(jiǎng)扣稅方式1月1日起施行~
4、雷軍做程序員時(shí)寫(xiě)的博客,很強(qiáng)大!
評(píng)論
圖片
表情
