标签:就会 生成 alt zset str rand font 一个 示例
限流实现的思路比较多,一般比较常见的思路有 计数器,滑动窗口,令牌桶。
而Redis有着丰富的数据结构以及分布式的支持,使用Redis实现限流的业务还是比较适合的。
并且在Redis 4.0 上可以安装限流模块 redis-cell,其思路也是令牌桶,其提供了限流的原子操作使用起来很方便可靠。
计数器
计数器即在限定的时间内记请求的次数,如果过了这个时间段就重置次数。
这和我们平时参加一些活动很像,比如超市里有时做活动,每天一个人可以领一个鸡蛋,今天领过了就不能再领了但到了明天又可以再领了。
这里可以用 String 来实现,比如要实现一分钟限制100次,只要记下上次请求的是哪一分钟,并记住这一分钟请求的次数即可,利用过期时间可以淘汰不用的数据。
public function checkRequest($uid)
{$timeKey = self::LIMIT_TIME_KEY . $uid;//得到上次请求的时间
$lastTime = $this->redis->get($timeKey);if ($lastTime) {// 看看时间戳是不是已经过了一分钟(自己设定的时间范围)
$nowTime = time();if ($nowTime - $lastTime LIMIT_UNIT) {
//还没一分钟
// 获取下请求了多少次
$countKey = self::LIMIT_KEY . $lastTime . ‘:‘ . $uid;$count = $this