thinkphp 8.0 秒杀系统核心是分层控流与错峰保稳:redis缓存防穿透、队列削峰解耦;库存用list+decr双保险预热与原子扣减;订单异步化通过think-queue接入redis;缓存一致性靠补偿机制与定时校验;防刷采用nginx限流+redis用户计数+前端验证。

ThinkPHP 8.0 搭建高并发秒杀系统,核心不在堆功能,而在分层控流、错峰保稳。Redis 缓存负责扛读压、防穿透,队列负责削峰填谷、解耦写操作——两者配合得当,才能真正扛住万级并发而不超卖、不卡顿、不丢单。
库存预热与原子扣减:用 Redis List + DECR 做双保险
秒杀开始前,把可用库存一次性推入 Redis List(如 goods:1001:stock),每条值可设为 1 或商品 ID,便于追踪;同时用字符串键 goods:1001:stock_count 记录总数,配合 DECR 原子操作做快速校验。
- 用户请求来时,先 DECR goods:1001:stock_count,返回值 ≥ 0 才表示有库存,立即进入下单流程
- 若需精确控制“谁抢到了”,再从 List 中 RPOP 一个唯一标识(如 token 或用户 ID),避免多个请求同时通过 DECR 后争抢同一条 List 数据
- DECR 失败(返回负数)直接返回“已售罄”,不进后续逻辑,省去数据库查询开销
订单异步化:用 think-queue 接入 Redis 队列,不卡主线程
TP8 内置 think-queue 支持 Redis 驱动,比手写 LPUSH/RPOP 更健壮,自动重试、失败日志、延迟投递都开箱即用。
- 配置中指定 Redis 连接参数,并设置 queue 为 redis,队列名建议按业务区分,如 seckill_order
- 下单接口只做轻量操作:校验通过后,将必要字段(user_id, goods_id, order_sn 等)序列化,调用 Queue::push(SeckillOrderJob::class, $data)
- 后台起常驻 worker(php think queue:listen),由独立进程消费任务,执行创建订单、扣减 DB 库存、发通知等耗时操作
缓存一致性:Redis 库存与 MySQL 不脱节的关键动作
单纯靠 Redis 扣减无法保证最终一致——万一订单写库失败,Redis 库存已扣,就会“少卖”。必须引入补偿与闭环机制。
- Worker 消费成功后,再用 INCR 把已确认下单的库存从 Redis 中加回(或清空对应 key),作为二次核对依据
- 定时任务每 5 分钟比对 Redis stock_count 和 MySQL 商品表 stock 字段,差值 > 0 时触发告警并人工介入
- 所有数据库写操作必须包裹在事务中,且订单表与商品表更新放在同一事务内,避免部分成功导致状态分裂
防刷与限流:网关层 + 应用层双拦截
再强的后端也扛不住恶意请求,必须前置过滤。
- Nginx 层用 limit_req 对 /seckill 接口做 IP 级限流(如 5r/s),快速拒绝高频扫描
- 应用层用 Redis 计数器(seckill:uid:12345)记录单用户当日参与次数,超过阈值直接拦截
- 前端加简单图形验证码或滑块验证(非必填但触发风控时弹出),成本低、效果实
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











