laravel 并发限流默认采用 redis 实现的令牌桶算法,支持内置 throttle 中间件(如 throttle:100,1)、自定义用户级策略、手写 tokenbucket 类、队列任务限流;需确保 redis 正常、禁用 array 缓存、合理设置桶容量。

Laravel 在并发场景下用令牌桶算法限流,核心是借助 Redis 实现“匀速产令牌 + 按需取令牌”的机制,既能应对突发流量,又避免资源被耗尽。它比简单计数器更灵活,比漏桶更友好,是 Laravel 官方 throttle 中间件默认采用的方案。
直接使用内置 throttle 中间件(最快落地)
这是最轻量、最推荐的起步方式,底层已基于 Redis + 令牌桶封装好:
- 在
routes/api.php中为接口加中间件,例如:Route::get('/data', [DataController::class, 'index'])->middleware('throttle:100,1');
表示每分钟最多 100 次请求,按 IP 或登录用户自动区分桶。 - 若需按用户 ID 精确限流(非 IP),可在
App\Providers\RouteServiceProvider的boot()方法中定义命名策略:RateLimiter::for('user_api', function (Request $request) { return Limit::perMinute(200)->by($request->user()->id); });
再在路由中写->middleware('throttle:user_api')。 - 注意:该方式默认使用
cache驱动(通常指向 Redis),确保.env中CACHE_DRIVER=redis且 Redis 连接正常。
自定义令牌桶模型(精准控制产/消节奏)
当内置策略无法满足复杂逻辑(如动态配额、多级桶、非分钟粒度),可手写 TokenBucket 类封装 Redis 操作:
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 用 Redis List 存储令牌,
LPUSH入桶、RPOP出桶,桶容量固定(如 50 个),避免无限堆积。 - 通过定时任务(如 Artisan 命令 + Laravel Scheduler)匀速补发令牌,例如每 200ms 补 1 个:
php artisan tokens:add --bucket=api_login --count=1,确保速率稳定可调。 - 每次请求前调用
get()方法尝试取令牌;失败则返回 HTTP 429 Too Many Requests,并建议前端重试时间(可通过Retry-After响应头传递)。
结合队列任务做异步限流(防任务风暴)
对发送邮件、生成报表等耗时操作,不能只限 API 层,还要约束后台任务执行节奏:
- 在 Job 的
handle()方法中嵌入 Redis 限流逻辑:Redis::throttle('job:send_'.$this->userId)->allow(3)->every(60)->then(...)。 - 若需更严格的“固定间隔放行”(如每 500ms 最多处理 1 个任务),可用 Lua 脚本实现漏斗式令牌发放,但本质仍是令牌桶思想的变体——只是把“产令牌”时机从定时改为按需计算上一次发放时间差。
- 配合
$this->release($delay)实现被限流任务的延迟重试,避免阻塞队列。
关键配置与避坑提醒
真正起作用的前提条件必须检查到位:
- Redis 必须启用且连接稳定,
php artisan tinker中运行Redis::ping()验证。 - 不要在本地缓存(array driver)下测试限流,它不支持跨进程共享状态,会导致限流失效。
- 避免将限流键设计成纯静态字符串(如
throttle:api),否则所有用户共用一个桶;务必用by($request->ip())或by($request->user()?->id)区分主体。 - 高并发压测时,单个桶容量不宜设得过大(如 >1000),否则 Redis List 的
LLEN和RPOP开销上升,反而成为瓶颈。










