为什么Laravel Redis :: throttle这么慢,无法获得锁?

时间:2019-03-07 13:21:39

标签: laravel redis throttling

我正在尝试限制documentation中所说的繁重操作。当允许操作时-它会迅速燃烧。

但是,当操作达到油门限制时-等待约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回调也会立即触发。有办法解决吗?

1 个答案:

答案 0 :(得分:0)

当我面对同样的问题时,我弄清楚了为什么要花这么长时间- 看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命令,则会看到缓存中正在发生的情况,非常适合调试。