您好,登錄后才能下訂單哦!
有時候我們需要限制一個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如何限制IP訪問次數的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。