有时候我们需要给我们写的接口来定义请求限制次数(限流) 如多长时间之内只能请求多少次。这样可以防止某些恶意用户一直请求我们的接口 给服务器减轻压力。
应用场景: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就可以了。