为什么 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
,你也可以看看
我正在尝试像 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
,你也可以看看