php实现秒杀功能
PHP实现秒杀功能的关键技术
秒杀功能的核心在于解决高并发下的资源竞争问题,确保数据一致性和系统稳定性。以下是实现秒杀功能的常见方案:
使用Redis原子操作
Redis的原子性操作能有效避免超卖问题。通过INCR或DECR命令操作库存,结合Lua脚本保证操作的原子性。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$script = <<<LUA
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock > 0 then
redis.call('DECR', KEYS[1])
return 1
end
return 0
LUA;
$result = $redis->eval($script, ['product_stock'], 1);
if ($result) {
// 秒杀成功,处理订单
}
消息队列异步处理
将秒杀请求放入消息队列(如RabbitMQ、Kafka),后端消费者顺序处理订单,缓解数据库压力。

// 生产者示例(使用PHP的AMQP扩展)
$connection = new AMQPConnection(['host' => 'localhost']);
$channel = $connection->channel();
$channel->queue_declare('seckill_queue', false, true, false, false);
$msg = new AMQPMessage(json_encode(['user_id' => 123, 'product_id' => 456]));
$channel->basic_publish($msg, '', 'seckill_queue');
数据库乐观锁
通过版本号或库存条件控制并发更新,需配合事务使用。
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT stock FROM products WHERE id = ? FOR UPDATE");
$stmt->execute([$productId]);
$stock = $stmt->fetchColumn();
if ($stock > 0) {
$update = $pdo->prepare("UPDATE products SET stock = stock - 1 WHERE id = ? AND stock = ?");
$update->execute([$productId, $stock]);
if ($update->rowCount() > 0) {
$pdo->commit();
// 秒杀成功
}
}
$pdo->rollBack();
限流与防刷策略
使用令牌桶或漏桶算法限制请求频率,Nginx层可配置限流:

limit_req_zone $binary_remote_addr zone=seckill:10m rate=10r/s;
location /seckill {
limit_req zone=seckill burst=20 nodelay;
}
PHP代码中可结合IP、用户ID进行更细粒度的控制:
$key = 'user_limit:' . $userId;
$redis->multi();
$redis->incr($key);
$redis->expire($key, 60);
$count = $redis->exec()[0];
if ($count > 5) {
die('请求过于频繁');
}
缓存预热与静态化
提前将商品信息加载到Redis,页面静态化减少动态请求:
// 预热缓存
$product = getProductFromDB($productId);
$redis->hMSet('product:' . $productId, [
'stock' => $product['stock'],
'name' => $product['name']
]);
服务降级与熔断
当系统压力过大时,返回降级页面或启用排队机制:
if ($redis->get('system_overload')) {
echo json_encode(['code' => 503, 'msg' => '系统繁忙请稍后']);
exit;
}
实施建议
- 压测验证:使用JMeter等工具模拟高并发场景
- 监控报警:实时监控Redis、数据库等关键指标
- 多级缓存:本地缓存+分布式缓存组合使用
- 库存分离:预扣库存与实际库存分开管理
以上方案可根据实际业务场景组合使用,建议先从Redis原子操作+消息队列的基础架构入手,逐步优化其他环节。






