/**
 * 频率控制函数
 * @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);
}

 

 
 posted on 2021-11-15 16:07  瀚海  阅读(39)  评论(0编辑  收藏  举报