redis實現的四種常見限流策略

2022-09-24 10:15:11 字數 2277 閱讀 7646

目錄

優點

缺點

controller

@requestmapping(valuerqtlule = "/start",method = requestmethod.get)

public map start(@requestparam map parammap)

service

@override

public map startqps(map parammap)

string rediskey = "redisqps";

redisatomicinteger redisatomicinteger = new redisatomicinteger(rediskey, redistemplate.getconnectionfactory());

int no = redisatomicinteger.getandincrement();

//設定時間固定時間視窗長度 1s

if (no == 0)

//判斷是否超限 time=2 表示qps=3

if (no > times)

//返回成功告知

map map = new hashmap<>();

map.put("success", "success");

return map;

}結果測試

我們設定的qps=3 , 我們可以看到五個併發進來後前三個正常訪問,後面兩個就失敗了。稍等一段時間我們在併發訪問,前三個又可以正常訪問。說明到了下乙個時間視窗

優點

缺點

controller

@requestmapping(value = "/startlist",method = requestmethod程式設計客棧.get)

public map startlist(@requestparam map parammap)

service

@requestmapping(value = "/startlist",method = requestmethod.get)

public map startlist(@requestparam map parammap)

結果測試

優點

缺點

controller

@requestmapping(value = "/startloutong",method = requestmethod.get)

public map startloutong(@requestparam map parammap)

service

在service中我們通過redis的list的功能模擬出桶的效果。這裡**是實驗室性質的。在真實使用中我們還需要考慮併發的問題

@override

public map startloutong(map parammap)

long size = redistemplate.opsforlist().size(rediskey);

if (size >= times)

long along = redistemplate.opsforlist().rightpush(rediskey, parammap);

if (along > times)

map map = new hashmap<>();

map.put("success", "success");

return map;

}下游消費

@component

public class schedulertask

}測試

令牌桶和漏桶法是一樣的。只不過將桶的作用方向改變了一下。

漏桶的出水速度是恆定的,如果流量突然增加的話我們就只能拒絕入池

但是令牌桶是將令牌放入桶中,我們知道正常情況下令牌就是一串字元當桶滿了就拒絕令牌的入池,但是面對高流量的時候正常加上我們的超時時間就留下足夠長的時間生產及消費令牌了。這樣就盡可能的不會造成請求的拒絕

最後,不論是對於令牌桶拿不到令牌被拒絕,還是漏桶的水滿了溢位,都是為了保證大部分流量的正常使用,而犧牲掉了少部分流量

public map startlingpaitong(map parammap)

map map = new hashmap<>();

map.put("success", "success");

return map;

}@scheduled(cron="*/1 * * * * ?")

private void process()

}

四種限流思想

假設有有個容積大小固定的過濾器,過濾器的入口處流量大小不設限制,容器出口的流量大小固定 過濾器代表漏桶 過濾器入口表示客戶端連線過來的請求 過濾器出口表示通過了限流中介軟體的客戶端請求 因為過濾器容積固定,所以當出口流出的速率小於入口流入的速率時,隨著時間的積累,過濾器的容積會被填滿,此時再傳送過來...

3種方式實現Redis限流

redis限流的實現方式有3種,分別是 1 基於redis的setnx的操作,給指定的key設定了過期實踐 2 基於redis的資料結構zset,將請求打造成乙個zset陣列 3 基於redis的令牌桶演算法,輸出速率大於輸入速率,就要限流。第一種 基於redis的setnx的操作 我們在使用red...

Python實現排序方法常見的四種

1.氣泡排序,相鄰位置比較大小,將比較大的 或小的 交換位置 def maopao a for i in range 0,len a for j in range 0,len a i 1 if a j a temp a j 1 a j 1 a j a j temp print a print a p...