最常见的计数限流
设置接口每秒请求阈值,一秒内每一个请求计数+1,超过阈值的请求可以随意处理。
$redis = new redis();
$redis->connect($host, $port);
$redis->auth($auth);
$key = "request:" . $requestUri . ":" . time();
$qps = $redis->incr($key);
$redis->expire($key, 3);
if ($qps > $qpsThreshold) {
// 处理超过阈值的请求
}
不过这样的限流策略有很大的局限性:
某接口设置100阈值,0.9~1.0秒中间进入100个请求,1.0~1.1秒中间进入100个请求,系统需要在0.9~1.1秒处理200个请求
在一个时间窗口内对请求进行限速
如果有一个时间窗口,那么就可以做到0.9~1.9秒中间只能进入100个请求
$redis = new redis();
$redis->connect($host, $port);
$redis->auth($auth);
// 计数器自增
$keyCount = "phpRateLimit_{$requestUri}_count";
$count = $redis->incr($keyCount);
// 处理“时间窗口key”和“请求唯一标记”
$keyMonitor = "phpRateLimit_{