redis限制IP訪問次數的方法

有時候我們需要限制一個api或頁面訪問的頻率,例如單ip或單用戶一分鐘之內只能訪問多少次,類似這樣的需求很容易用redis來實現。

redis限制IP訪問次數的方法

策略1:

redis中保存一個count值(int),key為user:$ip,value為該ip訪問的次數,第一次設置key的時候,設置expires。

count加1之前,判斷是否key是否存在,不存在的話,有兩種情況:1、該ip未訪問過;2、該ip訪問過,但是key已經過期了。那么此時需要再次設置一次expires。

如果用戶訪問的時候,判斷count的值是否大于上限,如果低于上限,就處理請求,否則就拒絕處理請求。

策略2:

考慮這種情況,假設只允許用戶60秒內訪問100次,如果有一個用戶在第1秒訪問了1次,在第59秒的時候,訪問了99次,然后在第61秒的時候,訪問了100次。

如果按照策略1的情況處理,第1~60秒之間接受了100次,在第61秒接收100次請求,所以62~120這段時間內,不再處理該ip的請求。

貌似沒問題,但是,細細思考一下,第59秒到61秒之間接受了99+100=199請求,時間間隔只有3秒。那么這樣的話,最初的設計就存在問題了。

解決方案:可以使用redis的list(雙向隊列)數據結構,key就是user:$ip,也就是每一個ip設置一個雙向隊列,每次請求到達的時候,進行如下判斷:

1、如果list中的元素個數少于100個,那么就將請求到達時的時間戳Lpush到list中。

2、如果list中的元素多余100個,那么,就取出Lindex(-1)即最右邊,也就是100個請求中最早的那一個請求的時間戳,如果最早的時間戳和當前時間戳相差超過60秒,那么表示第一個請求已經過期了,就將第一個請求出隊Rpop。然后將當前時間戳入隊Lpush。

更多redis知識請關注redis入門教程欄目。

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享