Почему Laravel Redis :: throttle так медленно работает, когда не может получить блокировку? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь ограничить тяжелые операции, как сказано в документации .Когда операция разрешена - она ​​горит быстроВот код:

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 голосов
/ 03 апреля 2019

Когда я столкнулся с той же проблемой, я понял, почему это занимает так много времени - глядя на 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, вы увидите, что происходит в кэше, что удобно для отладки.

...