laravel - 为什么 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
回调也会立即触发。有没有办法解决这个问题?
解决方案
当我面临同样的问题时,我明白了为什么需要这么长时间 - 看看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
,你也可以看看
推荐阅读
- laravel - Laravel-VerifyCsrfToken 排除不工作
- javascript - 无法存储来自的用户输入
在反应状态对象中 - django - DRF 序列化程序返回翻译后的选择字段值
- blazor - Blazor @onclick 部署后无法正常工作
- java - 如何在单元测试中为字符串设置值?
- r - 是否有读取特定值并移至下一列的 R 函数?
- python - 为什么没有双重打印请求时 Python 代码返回“无”?
- ubuntu - Syslog 快速增长 - gnome-session
- angular - 迁移到 Angular 9 和 Ivy 后库中的导入/导出问题
- python - 使用 Python 向用户显示验证码