php秒杀实现
秒杀系统核心设计
高并发秒杀系统需解决超卖、性能瓶颈、数据一致性等问题。PHP实现需结合缓存、队列、数据库锁等机制。
库存预减与缓存
采用Redis原子操作预减库存,避免直接穿透数据库。使用DECR命令确保原子性:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$remaining = $redis->decr('product_123_stock');
if ($remaining < 0) {
$redis->incr('product_123_stock'); // 恢复库存
die('已售罄');
}
消息队列削峰
将实际下单请求转入RabbitMQ/Kafka队列异步处理,缓解数据库压力:
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('seckill_queue', false, true, false, false);
$msg = new AMQPMessage(json_encode(['user_id' => 1, 'product_id' => 123]));
$channel->basic_publish($msg, '', 'seckill_queue');
数据库最终一致性
采用乐观锁保证数据准确性,MySQL示例:
UPDATE products
SET stock = stock - 1
WHERE id = 123 AND stock > 0;
限流与防刷
使用Redis实现令牌桶限流:
$rateLimitKey = 'user_1_limit';
$maxRequests = 5;
$expireTime = 60;
if ($redis->exists($rateLimitKey)) {
$count = $redis->incr($rateLimitKey);
if ($count > $maxRequests) {
die('操作过于频繁');
}
} else {
$redis->setex($rateLimitKey, $expireTime, 1);
}
服务分层架构
前端展示层:静态化商品页,CDN加速 逻辑层:无状态服务,横向扩展 数据层:Redis集群+MySQL分库分表
压测与降级方案
使用JMeter模拟并发测试,制定熔断策略:

- 当系统负载超过阈值时关闭秒杀入口
- 启用排队机制替代直接抢购
- 核心服务与非核心服务隔离部署






