1. 程式人生 > >php中通過redis實現介面限速

php中通過redis實現介面限速

介面限速的原因

單使用者請求介面過快可能造成鎖等待超時、資料操作異常等問題。

單伺服器下

在單伺服器服務環境下,通過開啟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';