发现一个好玩的东西,巧妙利用redis做一个限流。
目标:根据特征值(redis的key)对某些个调用(做在中间件里)做一个限流。比如:对某个ip进行限流(仅供参考,不能直接使用)。
功能:可以对所有需要限流的地方做一个限制。
/*
*$limit_time时间内超过$limit_count次请求次数则提示请求太频繁,请稍后再试
*/
public function handle($request, \Closure $next)
{
$limit_time = 10;
$limit_count = 10;
$machine = $request->header('machine');
//获取到ip。
$ip = IpService::_get_client_ip();
//获取redis对象。
$redis = RedisService::redis_client();
$check = $redis->exists($ip);
if($check){
$redis->incr($ip);
$count = $redis->get($ip);
//时长内请求次数。
if($count > $limit_count){
exit('请求太频繁,请稍后再试!');
}
}else{
$redis->incr($ip);
//限制时长
$redis->expire($ip,$limit_time);
}
return $next($request);
}