Go GO實現滑動視窗限流演算法 單機版

2022-01-30 13:07:11 字數 2199 閱讀 4387

具體解釋如下 , **在最下面

1.10秒內通過5次 , 這條線就是佇列list,當第乙個事件進來,佇列大小是0,時間是第1秒:

2.因為size=0,小於5,都沒有到限制的次數,完全不用考慮時間視窗,直接把這次事件的時間戳放到0的位置:

3.第2.8秒的時候,第二個事件來了。因為此時size=1,還是小於5,把這次事件的時間戳放到0的位置,原來第1秒來的事件時間戳會往後移動一格:

4.陸續的又來了3個事件,佇列大小變成了5,先來的時間戳依次向後移動。此時,第6個事件來了,時間是第8秒:

5.因為size=5,不小於5,此時已經達到限制次數,以後都需要考慮時間視窗了。所以取出位置4的時間(離現在最遠的時間),和第6個事件的時間戳做比較:

6.得到的差是7秒,小於時間視窗10秒,說明在10秒內,來的事件個數大於5了,所以本次不允許通過:

7.接下來即便來上100個事件,只要時間差小於等於10秒,都同上,拒絕通過:

8.第11.1秒,第101次事件過來了。因為size=5,不小於5,所以取出位置4的時間(離現在最遠的時間),和第101個事件的時間戳做比較:

9.得到的差是10.1秒,大於時間視窗10秒,說明在10秒內,來的事件個數小於等於5了,所以本次允許通過:

10.刪除位置4的時間(離現在最遠的時間),把這次事件的時間戳放到0的位置,後面的時間戳依次向後移動:

往後再來其他事件,就是重複4-10的步驟,即可實現,在任意滑動時間視窗內,限制通過的次數

其本質思想是轉換概念,將原本問題的確定時間大小,進行次數限制。轉換成確定次數大小,進行時間限制。

package utils

import "time"

var limitqueue map[string

]int64

varok bool

//單機時間滑動視窗限流法

func limitfreqsingle(queuename string, count uint,timewindow int64) bool

if _, ok = limitqueue[queuename]; !ok

//佇列未滿

if uint(len(limitqueue[queuename])) < count

//佇列滿了,取出最早訪問的時間

earlytime := limitqueue[queuename][0]

//說明最早期的時間還在時間視窗內,還沒過期,所以不允許通過

if currtime-earlytime <=timewindow

else

return

true

}

使用的案例:

func limitipfreq(c *gin.context, timewindow int64, count

uint) bool )

return

false

}

return

true

}

滑動視窗演算法 演算法 滑動視窗 二

演算法 這算是滑動視窗的另外乙個典型題目,在資料量比較少的時候,可以直接採用暴力法解決 不過資料量比較大的時候,我們就需要想辦法解決視窗裡面最大值的思路,這裡我們採用雙端佇列queue來實現,借助 queue來儲存前面計算過的最大值資訊。題目 解法1 暴力解法 按照 視窗大小,從頭到尾依次遍歷,將每...

演算法 滑動視窗

一.滑動視窗 滑動視窗其實就是高階版的雙指標技巧,只不過它依靠了資料結構 hashmap,hashset 的幫助,使得雙指標運用起來更加的靈活,更加的方便,他主要就是來解決子字串匹配問題。他主要的思路就是這樣的固定步驟 1 我們在字串 s 中使用雙指標中的左右指標技巧,初始化 left right ...

演算法 滑動視窗

最多可以將k個值從0變成1,因此滑動視窗的限制條件 0的數量 zeros 小於k,演算法過程如下 有乙個滑動視窗 slipper 每次都會從a中讀入乙個數 當讀入的數為0時,zeros 當zeros的數量大於k時,會取出slipper首部的元素,當取值為0時zeros 總體 如下 上述演算法效率並不...