php中通過redis實現介面限速
阿新 • • 發佈:2019-02-19
介面限速的原因
單使用者請求介面過快可能造成鎖等待超時、資料操作異常等問題。
單伺服器下
在單伺服器服務環境下,通過開啟session基於session的檔案鎖方式可以很好的避免單個使用者請求介面頻率過快的問題
負載均衡環境下
多臺伺服器session資料需要共享,通常會放在一臺共享伺服器中,如mysql、redis、memcache等,(不建議放在mysql中,很容易造成連線數不夠用問題),如此一來就不能像單伺服器一樣利用session的檔案鎖方式來控制介面請求頻率。
利用redis限制介面請求頻率
通過請求計數的方式來解決限制請求頻率問題,因為是併發操作,所以須利用原子操作來避免,通過redis的 incr 方法即可實現
<?php function getRedis() { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); return $redis; } function getApiLimit($api, $default = '2000') { //介面名稱 = 每次請求ms間隔 $info = [ 'user.info' => '500', 'user.login' => '1000' ]; return isset($info[$api]) ? $info[$api] : $default; } $api = isset($_GET['path']) ? $_GET['path'] : 'main'; $time = getApiLimit($api); $key = "api_limit_" . $api; $redis = getRedis(); $num = $redis->incr($key); if($num == 1) { $redis->pExpire($key, $time); } else { exit('api limit'); } echo 'success';