/**
* 频率控制函数
* @param string $product 保持唯一
* @param string $key 限制频率的维度 比如uid
* @param int $millisecond 毫秒间隔内只可以访问1次
* @return bool true-可以正常访问 false-命中频率控制
*/
function controlRate($product, $key, $millisecond) {
if (empty($product) || empty($key) || !is_int($millisecond) || $millisecond <= 0) {
return true;
}
$millTime = intval(microtime(true) * 1000);
$key = sprintf('ctrl_%s_%s', $product, $key);
$redis = new Redis();
$redis->connect('redis');
$redis->auth('123456');
$lastTimeRes = $redis->get($key);
if ($lastTimeRes === false) {
$addRes = $redis->setNx($key, $millTime);
// 此处有设置失败的风险
$redis->expire($key, 86400);
return $addRes;
}
// 若存在 则比对现在的时间 若频率超过x毫秒 则提示过于频繁
$nowTime = $millTime;
if ($nowTime - intval($lastTimeRes) < $millisecond) {
return false;
}
// 记录最新时间
return $redis->setEx($key, 86400, $millTime);
}