首頁 >資料庫 >Redis >redis限制IP存取次數的方法

redis限制IP存取次數的方法

尚
轉載
2020-04-16 09:11:203927瀏覽

有時候我們需要限制一個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入門教學欄位。

以上是redis限制IP存取次數的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除