首页 > 解决方案 > 为什么 Laravel Redis::throttle 无法获得锁时那么慢?

问题描述

我正在尝试像文档中所说的那样限制繁重的操作。当允许操作时 - 它会快速燃烧。

但是当操作达到油门限制时 - 它在油门回调触发之前等待约 3 秒。这是代码:

Artisan::command('temp', function () {
    Illuminate\Support\Facades\Log::debug("Start temp");
    Illuminate\Support\Facades\Redis::throttle("test123")
        ->allow(1)
        ->every(5)
        ->then(function () {
            Illuminate\Support\Facades\Log::debug("Logged immediately when allowed");
        }, function () {
            Illuminate\Support\Facades\Log::debug("Logged after ~3 seconds on throttle");
        });

        Illuminate\Support\Facades\Log::debug("Logged immediately or after ~3 seconds depending on above");
});

我预计on throttle回调也会立即触发。有没有办法解决这个问题?

标签: laravelredisthrottling

解决方案


当我面临同样的问题时,我明白了为什么需要这么长时间 - 看看Illuminate\Redis\Limiters\DurationLimiterBuilder我们看到:

/**
 * The amount of time to block until a lock is available.
 *
 * @var int
 */
public $timeout = 3;

...

/**
 * Set the amount of time to block until a lock is available.
 *
 * @param  int  $timeout
 * @return $this
 */
public function block($timeout)
{
    $this->timeout = $timeout;

    return $this;
}

所以理论上你只需要添加->block(1)或者如果你正在使用作业并且你延迟重新排队它们,你也可以使用 0 。

(实际上我必须清除缓存并做了一个composer dump-autoload使其工作)

此外,如果您使用该redis-cli monitor命令,您会看到缓存中发生了什么,非常适合调试。

编辑: 过了一会儿我改成Redis::funnel,你也可以看看


推荐阅读