Laravel 限流源代码里面的困惑

// F:\laravel6\vendor\laravel\framework\src\Illuminate\Cache\RateLimiter.php

    public function hit($key, $decaySeconds = 60)
    {
        $this->cache->add(
            $key.':timer', $this->availableAt($decaySeconds), $decaySeconds
        );

        $added = $this->cache->add($key, 0, $decaySeconds);

        $hits = (int) $this->cache->increment($key);

        dump($added);
        dump($hits);

        if (! $added && $hits == 1) {
            $this->cache->put($key, 1, $decaySeconds);
        }

        return $hits;
    }

希望大家能帮我看一下这个问题,谢谢

阅读 2.1k
2 个回答

进不去才正常,与定时器缓存相关,确保在规定的时间间隔内只允许点击一次,从而达到限流的效果。

hit实现解析:

    public function hit($key, $decaySeconds = 60)
    {
        // 步骤1
        $this->cache->add(
            $key.':timer', $this->availableAt($decaySeconds), $decaySeconds
        );
        
        // 步骤2,key不存在时,缓存中添加一个key且返回true
        $added = $this->cache->add($key, 0, $decaySeconds);
        
        // 步骤3,加一,注意key不存在时,increment也会在缓存中新增key
        $hits = (int) $this->cache->increment($key);
        
        // 步骤4,防止泄漏
        // key存在,且刚好在步骤2和步骤3值之间过期,步骤3就会新建一个永不过期的key
        // 需要再设置一次过期时间
        if (! $added && $hits == 1) {
            $this->cache->put($key, 1, $decaySeconds);
        }
        
        return $hits;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题