計數器算法,是指在指定的時間周期内累加通路次數,達到設定的門檻值時,觸發限流政策。下一個時間周期進行通路時,通路次數清零。此算法無論在單機還是分布式環境下實作都非常簡單,使用redis的incr原子自增性,再結合key的過期時間,即可輕松實作。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iMwIDN3YmY1YTMxQjNhNWYyYzXxITNwADM4EzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
image.png
從上圖我們來看,我們設定一分鐘的門檻值是100,在0:00到1:00内請求數是60,當到1:00時,請求數清零,從0開始計算,這時在1:00到2:00之間我們能處理的最大的請求為100,超過100個的請求,系統都拒絕。
這個算法有一個臨界問題,比如在上圖中,在0:00到1:00内,隻在0:50有60個請求,而在1:00到2:00之間,隻在1:10有60個請求,雖然在兩個一分鐘的時間内,都沒有超過100個請求,但是在0:50到1:10這20秒内,确有120個請求,雖然在每個周期内,都沒超過門檻值,但是在這20秒内,已經遠遠超過了我們原來設定的1分鐘内100個請求的門檻值。