1. 程式人生 > >Redis實現訪問流量控制

Redis實現訪問流量控制

為什麼需要訪問流量控制

對於成熟的系統,一般會提供一些自我保護能力。其中比較重要的就是流量控制能力,一旦大促期間出現突發的流量高峰,系統頂不住的時候,如果沒有類似的保護系統,整個系統就可能掛掉。

因為在執行的系統有快取,掛掉的系統可能一時間快取跟不上,或者剛啟動起來的時候還沒有快取(恢復系統過程中,已有快取已經過期失效),那麼很可能系統起來就會掛掉,從而要經過很長時間才能恢復使用,這個恢復過程消耗一個小時、兩個小時可能都是比較好的。

一般,在突發高流量場景下,無論如何都不可能短時間的獲得特別高的服務能力。所以,不論是系統將近崩潰之前,還是系統崩潰之後需要重新啟動的時候,都需要一個流量控制系統來讓系統能夠服務,或者能夠恢復服務。原則是,“只要系統不死,就有東山再起的希望”。

首先,需要說明對於流量控制可以是在接入層入做,比如硬體的F5、軟體的Nginx、Apache Httpd。

這裡講述,如果使用redis做訪問流量控制,可以怎麼做。這裡所說的流量控制是限制一定時間內的請求次數,可以是限制IP級別,也可以是限制使用者Id級別。

方法

藉助redis的key過期機制,生成有效期1分鐘的key。當key存在時,計數加1,當key不存在時,建立key,同時設定過期時間。

程式碼如下:

public static bool canPass(limitKey string){
	Long value = redisTemplate.opsForValue().increment
(limitKey); if(value == 1L) { redisTemplate.opsForValue().set(limitKey, 1L, 60L, TimeUnit.SECONDS); } if (value > limit) { return false } return true; }