爲什麼需要訪問流量控制
對於成熟的系統,一般會提供一些自我保護能力。其中比較重要的就是流量控制能力,一旦大促期間出現突發的流量高峯,系統頂不住的時候,如果沒有類似的保護系統,整個系統就可能掛掉。
因爲在運行的系統有緩存,掛掉的系統可能一時間緩存跟不上,或者剛啓動起來的時候還沒有緩存(恢復系統過程中,已有緩存已經過期失效),那麼很可能系統起來就會掛掉,從而要經過很長時間才能恢復使用,這個恢復過程消耗一個小時、兩個小時可能都是比較好的。
一般,在突發高流量場景下,無論如何都不可能短時間的獲得特別高的服務能力。所以,不論是系統將近崩潰之前,還是系統崩潰之後需要重新啓動的時候,都需要一個流量控制系統來讓系統能夠服務,或者能夠恢復服務。原則是,“只要系統不死,就有東山再起的希望”。
首先,需要說明對於流量控制可以是在接入層入做,比如硬件的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;
}