php 秒杀的实现
秒杀系统的核心挑战
高并发场景下容易出现超卖、数据库崩溃等问题,需通过技术手段确保库存准确性和系统稳定性。
技术实现方案
数据库设计 创建商品表(含库存字段)和订单表,使用事务保证数据一致性:

CREATE TABLE `seckill_goods` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stock` int(11) NOT NULL COMMENT '库存',
`version` int(11) NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
PRIMARY KEY (`id`)
);
CREATE TABLE `seckill_orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`goods_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
乐观锁控制 通过版本号机制防止超卖:
// 更新库存时增加版本校验
$sql = "UPDATE seckill_goods SET stock = stock - 1, version = version + 1
WHERE id = :goods_id AND stock > 0 AND version = :current_version";
Redis预减库存 先将库存加载到Redis,通过原子操作减少内存库存:

$redis->decr('seckill_goods_' . $goods_id);
if ($redis->get('seckill_goods_' . $goods_id) >= 0) {
// 进入下单流程
}
消息队列削峰 使用RabbitMQ/Kafka缓冲请求:
// 生产者将请求入队
$queue->push([
'user_id' => $userId,
'goods_id' => $goodsId
]);
// 消费者异步处理
while ($msg = $queue->pop()) {
processOrder($msg);
}
限流措施 使用令牌桶算法控制流量:
$rateLimiter = new TokenBucket(1000); // 每秒1000个请求
if (!$rateLimiter->consume(1)) {
throw new Exception('请求过于频繁');
}
优化策略
- 静态资源CDN加速
- 独立部署秒杀服务
- 库存预热到缓存层
- 请求合法性校验(防脚本)
- 热点数据分离
注意事项
- 压测模拟真实场景
- 熔断机制防止雪崩
- 监控系统关键指标
- 前端按钮防重复点击
- 分布式锁协调多节点
通过以上技术组合可实现万级QPS的秒杀系统,实际部署时需根据业务规模调整参数。






