Laravel 限流源代码里面的困惑

发布于 2022-09-12 00:03:44 字数 637 浏览 12 评论 0

// 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;
    }

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青衫负雪 2022-09-19 00:03:44

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

云巢 2022-09-19 00:03:44

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;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文