先写一个基类,让所有的api的控制器都继承它,并且写一个_initialize方法,这是tp5的方法,执行其他方法前,会自动调用,类似于php的构造方法,我们可以获取请求者的ip,md5一下作为我们redis存储的key
然后去redis里用get去取,如果取到了值,则去判断是否为空,如果为空,则说明该ip第一次请求接口,则设置用set方法设置初始值为0,并且设置有效时间,如果不为空,并且大于了我们设置的请求次数,则不进行数据库操作,直接返回提示,如果小于我们设置的请求次数,则自增1

namespace app\api\controller;

use \think\Controller;
use think\cache\driver\Redis;

class Check extends Controller
{
    protected function _initialize(){
        //api接口限流
        $num = config('api_num');//每多少秒可以请求的次数
        $time = config('api_time');//多少秒内
        $ip = get_client_ip();
        $redis_key = md5($ip);
        $redis = new Redis();
        $count = $redis->get($redis_key);
        if(empty($count)){
            $redis->set($redis_key,1,$time);
        }else if($count >= $num){
            msg(0,'请求频率太高,请重试');
        }else{
            $redis->inc($redis_key);
        }
    }
}
最后修改:2019 年 10 月 24 日 10 : 13 AM
如果觉得我的文章对你有用,请随意赞赏