api接口限流(限制请求次数)

有时候我们需要给我们写的接口来定义请求限制次数(限流) 如多长时间之内只能请求多少次。这样可以防止某些恶意用户一直请求我们的接口 给服务器减轻压力。

应用场景:app端 用户收藏文章 取消收藏文章(某些恶意用户一直在app端重复点击收藏或取消收藏 这样对我们的数据库会造成很大的压力)


/**
 * 限制接口请求次数
 * @param  string $key   key名称
 * @param  int    $time  过期时间 单位:秒
 * @count  int    限制请求次数
 * @author zhouyulin@smzdm.com
 * @date   2018-06-11
 */
public function redis_limit($key,$time = 20,$count = 3)
{
    $result = array(
        'error_code' => 0,
        'error_msg'  => '',
        'data' => [],
    );

    $redis = new Redis();
    
    $redis->connect('127.0.0.1',6379);
    //$redis->auth('xxxxxx'); //Redis链接密码 如没有可不用写这一步

    $key_res = $redis->exists($key); //key是否存在

    if($key_res)
    {
        $redis->incr($key); //key对应的值自增1
        $nums = $redis->get($key); //获取key的值

        //key的值超过了请求次数
        if($nums > $count)
        {
            $result['error_code'] = 1;
            $result['error_msg']  = '操作频繁!请稍后重试!';
            goto ARCHOR_RESULT;
        }
    }
    else
    {
        //key不存在 写入redis
        $redis->setex($key,$time,1); //key 时间 值
    }

    ARCHOR_RESULT:
    return $result;
}

这样就可以了 在用户相关地方调用以上方法即可   传入的key可以是当前登录用户的主键id值 只要是唯一的 能够在redis中标识这是唯一的key就可以了。


声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与