class RateLimiter { private $redis; public function __construct() { $this->redis = new Redis(); $this->redis ->connect('127.0.0.1'); } /** * 频率限制 * * @param string $key 唯一的key值,可以是ip或者用户id * @param int $cycle 多少秒 * @param int $limit 多少次 * @return bool true-允许访问,false-禁止访问 */ public function accessLimit($key, $cycle = 2, $limit = 1) { //为空,则直接通过 if (!$key) { return false; } $used = $this->redis->get($key); // 1、查 if (false === $used) { $used = 0; } else if ($used >= $limit) { // 防止设置expire失败,补设一次 $ttl = $this->redis->ttl($key); if (-1 == $ttl) { $this->redis->expire($key, $cycle); } return false; } $ret = $this->redis->incr($key); //2、自增 // 首次写入,设置过期时间 if ($ret == 1) { $this->redis->expire($key, $cycle); } else if ($ret > $limit) { return false; } return true; } } $limit = new RateLimiter(); var_dump($limit->accessLimit('limit',3600,1)); var_dump($limit->accessLimit('limit',3600,1)); var_dump($limit->accessLimit('limit',3600,1));
redis 实现限流
最新推荐文章于 2024-07-11 16:53:33 发布