为什么 Laravel Redis::throttle 在无法获取锁的情况下这么慢?

Why Laravel Redis::throttle is so slow when could not obtain lock?

我正在尝试像 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 回调也会立即触发。有办法解决这个问题吗?

当我遇到同样的问题时,我明白了为什么需要这么长时间 - 查看 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,你也可以看看