秒杀php实现
秒杀系统核心设计要点
高并发、低延迟、数据一致性是秒杀系统的核心挑战。PHP实现需结合缓存、队列、限流等技术确保系统稳定。
数据库优化
使用InnoDB引擎并优化事务隔离级别。商品库存字段需添加无符号整型约束,避免超卖。
CREATE TABLE `seckill_goods` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`stock` int(11) unsigned NOT NULL COMMENT '剩余库存',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
缓存预热
活动开始前将商品信息加载到Redis,采用哈希结构存储:
$redis->hMSet('seckill:goods:1', [
'stock' => 100,
'version' => time() // 用于乐观锁
]);
库存扣减方案
悲观锁方案 使用SELECT...FOR UPDATE实现,但会导致性能瓶颈:

$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT stock FROM seckill_goods WHERE id=? FOR UPDATE");
$stmt->execute([$goods_id]);
乐观锁方案 通过版本号控制,推荐使用:
$redis->watch('seckill:goods:1');
$stock = $redis->hGet('seckill:goods:1', 'stock');
if($stock > 0){
$redis->multi()
->hIncrBy('seckill:goods:1', 'stock', -1)
->exec();
}
流量削峰
使用Redis列表作为消息队列:

// 下单请求入队
$redis->lPush('seckill:queue', json_encode([
'user_id' => 123,
'goods_id' => 1
]));
// 异步处理
while(true){
$task = $redis->rPop('seckill:queue');
if($task) processOrder($task);
}
限流措施
令牌桶算法实现
class RateLimiter {
private $redis;
private $key;
public function __construct($redis, $key) {
$this->redis = $redis;
$this->key = $key;
}
public function allow($capacity, $rate) {
$now = microtime(true);
$this->redis->multi()
->zRemRangeByScore($this->key, 0, $now - $capacity/$rate)
->zCard($this->key)
->zAdd($this->key, $now, $now)
->expire($this->key, $capacity/$rate + 1)
->exec();
return $count < $capacity;
}
}
最终一致性处理
使用定时任务补偿未完成的订单:
$pdo->prepare("UPDATE orders SET status=2 WHERE status=0 AND created_at<?")
->execute([date('Y-m-d H:i:s', time()-1800)]);
性能监控指标
建议监控以下关键指标:
- Redis命中率
- 数据库QPS
- 接口响应时间P99
- 消息队列积压量
通过以上技术组合,PHP实现的秒杀系统可支撑万级QPS。实际部署时需要配合Nginx负载均衡和OPcache加速。






